我有这样的文字
MyText.xyz;
MyText.abc + "ss";
我想要捕获MyText.
之后的文本,但不以;
或空格结尾,即我希望输出如下:
MyText.xyz
MyText.abc
我创建了这个正则表达式:MyText.(.*(?=\;))
以实现我的目标。
但是,现在从正则表达式匹配的文本是MyText.xyz
和MyText.abc + "ss"
,即第二个结果不正确。
答案 0 :(得分:1)
您可以使用否定的字符类来修复它:
MyText\.[^\s;]+
^^^^^^^
请参阅regex demo
正则表达式详细信息
MyText\.
- 文字MyText.
子字符串(请注意,必须转义.
以匹配文字.
字符)[^\s;]+
- 与空格(\s
)和;
char 在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
匹配任何空格字符。