2012-04-08 47 views
0

我打開一個文件,並找到我需要的線路,但後來我有麻煩從找到字符串如何提取值從線發現

70c 08:04:04.014 rexx TRACE 2203 8=4.4|9=892|35=J|49=ICE_SM_S|56=SM|34=280|70=0241608914160889|71=0|626=2|793=16|72=|466=1164266784|857=0|73=1|11=|37=1156426784|526=1156426674|38=1|198=1310883PTM|54=1|6=117.2100000000|336=R|625=P|55=B|461=FXXXXX|200=20120901|207=IFEU|53=1|30=ICE|453=2|448=SLM|447=C|452=7|448=FFC|447=C|452=12|75=20120210|60=20120310-09:04:04|77=O|58=CYU795|232=14|233=GL_TRADEJOBOUT|234=N|233=GL_ORDERJOBOUT|234=N|233=GL_TAKEN|234=0|233=GL_TRADETYPE|234=E| 

這是字符串創建一個變量,我想將其分配到的tag198一個變量,所以這將是

tag198 = '1310883PTMS' 

任何不需要|之後。

tag198 = line.match(/198=(.*)/)[1] 
puts tag198 

但是在198之後保留所有值;我只需要|之前的字符串。

回答

1

您的正則表達式的*是貪婪的,並且會消耗它所能夠使用的所有字符,而無需停止表達式的其餘部分進行匹配。表達式中沒有任何內容告訴ruby何時停止收集字符。

看看regular-expressions.info。對於你的問題的一個部分解決方法是將'|'您捕獲後:

tag198=line.match(/198=(.*)\|/)[1] puts tag198

的 '|'因爲它在正則表達式中具有特殊的含義,所以逃脫了。這雖然還沒有工作,因爲*仍然可以使用'|'字符,只要它留下一個匹配'|'的字符在我們的表達中。要完全修復,防止*從捕獲任何管道:

tag198 = line.match(/198=([^|]*)\|/)[1] puts tag198

看到這個變化here的結果。

+0

我試過你的正則表達式'/ 198 =(。*)\ | /',它沒有正確匹配(與OP相同的問題)@ ctcherry的解決方案工作正常。 – Alex 2012-04-08 20:46:57

+0

同意 - 剛剛更新了答案 – sgmorrison 2012-04-08 20:49:10

+0

'line.match(/ 198 =(。*)\ | /)[1]'---仍然留下跟蹤 – 2012-04-08 21:29:52

3

正則表達式更改爲:

/198=(.+?)\|/ 

這使得非貪婪和停在豎線。你必須逃避豎線,因爲它通常意味着正則表達式中的「或」。

0

如果僅僅是字母和數字,你可以使用

/198=([A-Za-z0-9]*)/ 

此外,如果你不知道,你可以測試rubular.com正則表達式,它也提供了有關在特殊包機的一些信息正則表達式,它是所有正則表達式需求的絕佳網站,即使它不適合Ruby。