我希望匹配精确和前缀通配符匹配,但有一个条件是它不应该被特定标记包围。
例如:如果要匹配的单词是test
,则正则表达式应匹配
test
,testing
,tester
,testing.aspx
但它不应与test</x>
和testing</x>
,tester</x>
以及带前缀的其他字词匹配test
我想出了一个匹配test</x>
的正则表达式。
string regex = string.Format("\\b{0}(\\S)*(?!</x>)", "test");
有人可以帮我纠正我的正则表达式吗?
答案 0 :(得分:2)
\btest(\S)*(?!</x>)
模式与test</x>
匹配,因为\btest
找到以test
开头的单词,然后匹配并重复捕获任何0+非空白字符,然后检查是否当前位置右侧没有</x>
。由于(\S)*
一次匹配整个</x>
,所以当正则表达式索引已经放在此</x>
之后,负向前瞻检查</x>
,因此它返回true并且匹配为成功。
哟可以使用
string regex = string.Format(@"(?>\b{0}[^<\s]*)(?!</x>)", "test");
// or, beginning with C#6
// var regex = $@"(?>\b{SearchWord}[^<\s]*)(?!</x>)";
请参阅regex demo
现在,它会像这样匹配:
(?>\btest[^<\s]*)
- 原子组匹配
\b
- 字边界test
- 搜索字词[^<\s]*
- 除<
和空格(?!</x>)
- 如果当前位置右侧有</x>
字符序列,则会导致匹配失败的否定前瞻