正则表达式语法

时间:2011-06-01 21:16:46

标签: ruby regex

我有一个类似的问题,对于之前提出的问题。但类似的做法显然不会产生类似的结果。

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,... T0n,而不是顶部的较长版本,然后是跟随它的整个^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,没有扩展或插件。我的ruby版本是1.8.6。

3 个答案:

答案 0 :(得分:2)

请改为尝试:

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

它使X行的组成为非捕获组,然后将最终模式的所有重复放入一个组中。所有X行都将在一次捕获中。

您可以使用Rubular(开发正则表达式不可或缺的工具)http://rubular.com/r/PRnurKy64Q

来测试

答案 1 :(得分:0)

这似乎有用......

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

答案 2 :(得分:0)

我不完全确定我理解你的问题,但我会试一试。看起来你想要:

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

这必须在多行模式下运行,以便^和$匹配换行符之前和之后。注意事项:我对mulitline正则表达式没有多少练习,所以你可能想要对^和$的使用进行健全性检查。

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