如何从找到的行中提取值

时间:2012-04-08 20:37:16

标签: ruby regex

我正在打开一个文件并找到我需要的行,但是我在找到的字符串中创建变量时遇到了麻烦

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之后保留所有内容;我只需要|之前的字符串。

3 个答案:

答案 0 :(得分:3)

将正则表达式更改为:

/198=(.+?)\|/

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

答案 1 :(得分:1)

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

看看regular-expressions.info。对你的问题进行部分修复就是放一个'|'捕获后:

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

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

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

查看此更改的结果here

答案 2 :(得分:0)

如果只能使用字母和数字

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

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