我正在打开一个文件并找到我需要的行,但是我在找到的字符串中创建变量时遇到了麻烦
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
之后保留所有内容;我只需要|
之前的字符串。
答案 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上测试正则表达式,它还提供有关正则表达式中特殊章程的一些信息,它是一个很好的站点,可满足您所有正则表达式的需求,即使它不是对于红宝石。