要在模式>>Digit<<
之间提取文本,我已成功使用了正则表达式&#34; (?<=\>>[0-9]+?<<)[ ].+?(?=\>>[0-9]+?<<)
&#34;。正则表达式选项设置为单行,因为要提取的文本可能是多行的。
>>1<< First Option For Third Variable Reply1 >>1<<
>>2<< Second Option For Third Variable Reply 1 >>2<<
>>3<< Third Option For Third Variable Reply 1
>>3<<
如果我删除正则表达式的[ ]
部分&#34; (?<=\>>[0-9]+?<<).+?(?=\>>[0-9]+?<<)
&#34;,使用正则表达式的匹配实际上会提取空格(例如>>1<<
和{{之间) 1}})这不是我的意图。我不明白为什么添加[]会排除那些空格。
我知道正则表达式中的方括号通常表示要包含的字符类。但是在这里,通过插入带空格的方括号,我设法排除空格(例如>>2<
和>>1<<
之间)。所以我试图了解它在我的案例中是如何运作的。
谢谢。
答案 0 :(得分:0)
关键是>>2<<
和>>3<<
之间有空格,当单线模式打开时,它们与.+?
匹配。
您可以尝试在第一个数字模式周围使用捕获组,并使用反向引用来匹配右侧的相同数字:
(?<=>>([0-9]+)<<).*?(?=>>\1<<)
请参阅regex demo
<强>详情
(?<=>>([0-9]+)<<)
- 确保有>>
,1位数字(第1组),<<
位于当前位置左侧的正面观察.*?
- 任意0个字符,尽可能少(?=>>\1<<)
- 一个积极的向前看,确保{I} >>
与第1组中的号码相同,<<
位于当前位置的右侧。请参阅C# demo:
var s = ">>1<< First Option For Third Variable Reply1 >>1<<\n\n>>2<< Second Option For Third Variable Reply 1 >>2<<\n\n>>3<< Third Option For Third Variable Reply 1 \n>>3<<";
var rx = @"(?<=>>([0-9]+)<<).*?(?=>>\1<<)";
var results = Regex.Matches(s, rx, RegexOptions.Singleline)
.Cast<Match>()
.Select(m => m.Value);
Console.WriteLine(string.Join("\n", results));
结果:
First Option For Third Variable Reply1
Second Option For Third Variable Reply 1
Third Option For Third Variable Reply 1
另一个想法是仅在>>...<<
模式之间禁止空格:
(?<=>>[0-9]+<<)(?!\s+>>[0-9]+<<).*?(?=>>[0-9]+<<)
^^^^^^^^^^^^^^^^
请参阅此regex demo