Ruby 如何从找到的行中提取值

Ruby 如何从找到的行中提取值,ruby,regex,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=11

我正在打开一个文件并找到所需的行,但是从找到的字符串创建变量时遇到了问题

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

正则表达式的
*
之前的字符串是贪婪的,它将消耗它所能消耗的所有字符,而不会停止表达式其余部分的匹配。表达式中没有告诉ruby何时停止收集字符

看。部分修复您的问题的方法是在捕获后加上“|”:

tag198=line.match(/198=(.*)\\124;/)[1]放置tag198

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

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


查看此更改的结果。

您的正则表达式的
*
是贪婪的,它将在不停止表达式其余部分匹配的情况下使用它所能使用的所有字符。表达式中没有告诉ruby何时停止收集字符

看。部分修复您的问题的方法是在捕获后加上“|”:

tag198=line.match(/198=(.*)\\124;/)[1]放置tag198

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

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


查看此更改的结果。

将正则表达式更改为:

/198=(.+?)\|/

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

将正则表达式更改为:

/198=(.+?)\|/

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

如果只能使用字母和数字

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

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

如果您只能使用字母和数字

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

另外,如果您不知道,您可以在rubular.com上测试正则表达式,它还提供了一些关于正则表达式中特殊特许权的信息,这是一个很好的站点,可以满足您所有正则表达式的需要,即使它不适用于ruby。

我尝试了您的正则表达式
/198=(.*)\\124;/
,但它没有正确匹配(与OP的问题相同)@ctcherry的解决方案确实有效。'line.match(/198=(.*)\\\\\\\/)[1]`--仍然保留traceThanks@TomasKlein;您能将答案标记为已接受(点击左侧上下箭头旁边的勾号)吗?我尝试了您的正则表达式
/198=(.*)\\\\\\\/
,但它没有正确匹配(与OP的问题相同)@ctcherry的解决方案确实有效。'line.match(/198=(.*)\\124;/)[1]`--仍然保留traceThanks@TomasKlein;您能将答案标记为已接受(点击左侧上/下箭头旁边的勾号)吗?