我有一个类似的问题,对于之前提出的问题。但类似的做法显然不会产生类似的结果。
新问题 - 我希望将以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。
答案 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+
假设。