正则表达" []"努力清除白色空间,但为什么以及如何?

时间:2017-11-29 12:48:29

标签: c# regex

要在模式>>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<<之间)。所以我试图了解它在我的案例中是如何运作的。

谢谢。

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