正则表达式语法
我有类似的问题,以前提出的问题。但类似的做法显然不会产生类似的结果。正则表达式语法
新的问题 - 我想匹配T中开始的第一场比赛的线路,并以X为第二场比赛开始以下行(整个字符串,通过另一个正则表达式在后面匹配)
我到目前为止是(^T(\d+)\n(.*?)(?:the_problem)/m)
我不知道用什么来代替“the_problem”,或者即使是这个问题。我假设了一些引用(?:\n|\z)
,但显然不是。我所尝试过的所有内容都不会将下一次出现的^T(\d+)
作为新组的开始,并且同时继续捕获每个事件之间的所有行。
Sample text;
T01C0.025
T02C0.035
T03C0.055
T04C0.150
T05C0.065
T06C0.075
%
G05
G90
T01
X011200Y004700
X011200Y009700
X018500Y011200
X013500Y-011200
X023800Y019500
T02
X034800Y017800
X-033800Y-017800
X032800Y017800
T03
X036730Y003000
X038700Y003000
X040668Y-003000
X059230Y003000
T04
X110580Y017800
X023800Y027300
X095500Y028500
X005500Y-006500
X021500Y-006500
T05
X003950Y002000
X003950Y004500
X003950Y007000
T06
X026300Y027300
M30
我只是想捕捉T01,T02的短版,... T开,而不是在顶部的更长的版本,那么^X(-?\d+)Y(-?\d+)
整个集合遵循它,因为另一场比赛。
Result 1.
Match 1. T01
Match 2. X011200Y004700
X011200Y009700
X018500Y011200
X013500Y-011200
X023800Y019500
Result 2.
Match 1. T02
Match 2. X034800Y017800
X-033800Y-017800
X032800Y017800
Result 3.
Match 1. T03
Match 2. X036730Y003000
X038700Y003000
....etc....
在此先感谢您的帮助;-)注意:我更喜欢使用原始的Ruby,没有扩展名或插件。我的红宝石版本是1.8.6。
尝试此代替:
^(T[^\s]+)[\n\r\s]((?:(?:X\S+)[\n\r\s])+)
它使为X
线成非捕获组的基团,然后把最终的模式的所有重复成一个单一的基。所有的X线将在一次捕获。
您可以测试此使用Rubular http://rubular.com/r/PRnurKy64Q
这似乎工作...
^(T[^\s]+)[\n\r\s]((X[^\s]+)[\n\r\s]){1,}
我不能完全肯定我理解你的问题,但我给这个一杆。它看起来像你想:
/(^T\d+$(^X[-A-Z\d]+$)+)*/g
这将对以后和换行前在多行模式,使^和$匹配运行。谨慎的说法:我没有太多的练习多线程正则表达式,所以你可能想对使用^和$做一个合理的检查。
此外,我注意到您的样本结果中没有包含类似于T01C0.025
的行,因此我根据此假设做出了T\d+
假设。
我无法工作,我正在Rubular中评估我的正则表达式,并且它没有'/ g'选项。像“T01C0.025 ...”这样的行并不意味着被捕获。 – tahwos 2011-06-01 21:37:31
一览(不可缺少的开发正则表达式工具),它看起来像你应该只写的,而不是试图塞进一切小,行由行分析器成正则表达式。 – 2011-06-01 21:23:20
这可能会在将来发生,但我使用几个不同的文件来获取信息,并且正则表达式还没有让我失望 - 在这里既没有美妙的伙计;-) – tahwos 2011-06-01 23:56:59