正则表达式选择不包括某些字符的文本

时间:2018-01-24 11:02:13

标签: c# regex

我有这样的文字

MyText.xyz;
MyText.abc + "ss";

我想要捕获MyText.之后的文本,但不以;或空格结尾,即我希望输出如下:

MyText.xyz
MyText.abc

我创建了这个正则表达式:MyText.(.*(?=\;))以实现我的目标。

但是,现在从正则表达式匹配的文本是MyText.xyzMyText.abc + "ss",即第二个结果不正确。

3 个答案:

答案 0 :(得分:1)

您可以使用否定的字符类来修复它:

MyText\.[^\s;]+
        ^^^^^^^ 

请参阅regex demo

正则表达式详细信息

  • MyText\. - 文字MyText.子字符串(请注意,必须转义.以匹配文字.字符)
  • [^\s;]+ - 与空格(\s)和; char
  • 之外的任何1个字符匹配的否定字符类

在C#中将其用作var pattern = @"MyText\.[^\s;]+";

答案 1 :(得分:1)

MyText\..+?\b(?<!;)
   ^  ^ ^  ^  ^
   |__|_|__|__|______ MyText : "MyText" literal
      |_|__|__|______ \.     : "." literal, escaped by "\"
        |__|__|______ .      : any character
           |__|______ ?\b    : non-greedy search up to boundary (\b)
              |______ (?<!;) : not ended by ';'

测试:

$ cat sample.txt
MyText.xyz;
MyText.abc + "ss";
MyText.uuu+"yyy";

$ grep -Po 'MyText\..+?\b(?<!;)' <sample.txt
MyText.xyz
MyText.abc
MyText.uuu

注意:这是基于@WiktorStribiżew的解决方案,背后添加

答案 2 :(得分:0)

您正在使用

MyText.(.*(?=\;))

第一个错误是.之后的MyText,如果你想匹配一个文字点,它应该是\.

下半部分也不正确,你试图匹配任意数量的非破线字符,然后是;,这就是你得到结果的原因。

请尝试使用此正则表达式:

MyText.[^ ;]*

[^ ;]*匹配任何不是空格或;的字符。如果您还不希望标签或换行符匹配,则可以改为使用以下内容:

MyText.[^\s;]*

\s匹配任何空格字符。