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;我只需要|.

4

3 回答 3

3

将您的正则表达式更改为:

/198=(.+?)\|/

这使它不贪婪并停在垂直条上。您必须转义竖线,因为它通常在正则表达式中表示“或”。

于 2012-04-08T20:45:17.750 回答
1

您的正则表达式*是贪婪的,并且会在不阻止其余表达式匹配的情况下消耗它可以使用的所有字符。表达式中没有任何内容告诉 ruby​​ 何时停止收集字符。

查看正则表达式.info。解决您的问题的部分方法是放置一个“|” 捕获后:

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

'|' 被转义,因为它在正则表达式中具有特殊含义。但这还不起作用,因为*仍然可以消耗 '|' 字符,只要它留下一个匹配 '|' 在我们的表达中。要完全修复,请防止*捕获任何管道:

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

在此处查看此更改的结果。

于 2012-04-08T20:44:34.893 回答
0

如果只有字母和数字,您可以使用

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

另外,如果你不知道,你可以在 rubular.com 上测试正则表达式,它还提供了一些关于正则表达式特殊章程的信息,它是一个很好的网站,可以满足你所有的正则表达式需求,即使它不是红宝石。

于 2012-04-10T22:16:10.583 回答