2011-06-01 130 views
2

我有类似的问题,以前提出的问题。但类似的做法显然不会产生类似的结果。正则表达式语法

Previous Question

新的问题 - 我想匹配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。

+2

一览(不可缺少的开发正则表达式工具),它看起来像你应该只写的,而不是试图塞进一切小,行由行分析器成正则表达式。 – 2011-06-01 21:23:20

+0

这可能会在将来发生,但我使用几个不同的文件来获取信息,并且正则表达式还没有让我失望 - 在这里既没有美妙的伙计;-) – tahwos 2011-06-01 23:56:59

回答

2

尝试此代替:

^(T[^\s]+)[\n\r\s]((?:(?:X\S+)[\n\r\s])+) 

它使为X线成非捕获组的基团,然后把最终的模式的所有重复成一个单一的基。所有的X线将在一次捕获。

您可以测试此使用Rubular http://rubular.com/r/PRnurKy64Q

+0

非常好的工作! – 2011-06-01 21:35:41

+0

的确很不错 - 谢谢你的解释! – tahwos 2011-06-01 21:45:00

+0

我注意到它在Rubular中有效,有或没有多行标志,你知道它的意义吗?顺便说一句......我从来没有关闭我的Rubular选项卡;-) – tahwos 2011-06-01 21:47:23

0

这似乎工作...

^(T[^\s]+)[\n\r\s]((X[^\s]+)[\n\r\s]){1,} 
+0

几乎 - 它停在第二行X,在每个组中。这些都是唯一的匹配... – tahwos 2011-06-01 21:27:22

+1

hrm ..它在这里工作http://www.rubular.com/r/sI5tzQm4TB ..你使用的是哪一行代码? – 2011-06-01 21:28:42

+0

我跟着链接,你使用了'^(T [^ \ s] +)[\ n \ r \ s]((X [^ \ s] +)[\ n \ r \ s]){0,} '这一次,但结果相同......只有2个X匹配,而且它们是唯一的,它们需要是一个匹配。 – tahwos 2011-06-01 21:31:04

0

我不能完全肯定我理解你的问题,但我给这个一杆。它看起来像你想:

/(^T\d+$(^X[-A-Z\d]+$)+)*/g 

这将对以后和换行前在多行模式,使^和$匹配运行。谨慎的说法:我没有太多的练习多线程正则表达式,所以你可能想对使用^和$做一个合理的检查。

此外,我注意到您的样本结果中没有包含类似于T01C0.025的行,因此我根据此假设做出了T\d+假设。

+0

我无法工作,我正在Rubular中评估我的正则表达式,并且它没有'/ g'选项。像“T01C0.025 ...”这样的行并不意味着被捕获。 – tahwos 2011-06-01 21:37:31