有人可以解释为什么结果1,2和3都是假的吗?看起来像一个微不足道的问题......但是,我仍然坚持:/
string input = "foo abc defg bar";
string pattern = "abc defg";
string pattern1 = "\b" + Regex.Escape(pattern) + "\b";
string pattern2 = "\b" + pattern + "\b";
string pattern3 = "\babc defg\b";
string pattern4 = pattern;
bool result1 = Regex.IsMatch(input, pattern1); // FALSE
bool result2 = Regex.IsMatch(input, pattern2); // FALSE
bool result3 = Regex.IsMatch(input, pattern3); // FALSE
bool result4 = Regex.IsMatch(input, pattern4); // TRUE
答案 0 :(得分:6)
不确定。您的\b
实际上是退格符,而不是正则表达式\b
。您需要使用"\\b"
将其嵌入到C#字符串文字中,或使用逐字字符串文字:@"\b"
。
请记住:反斜杠是C#字符串的转义符,就像正则表达式一样,所以如果你不小心,你需要转义两次,一次是字符串文字,一次是正则表达式。
另一件事:远离\b
,与\w
相同。 \b
是根据\w
定义的锚点,而\w
是一个字符类,除了快速的一次性任务之外几乎无用,你可以非常严格地控制你想要的一切比赛。 \b
只是意味着锚的一侧是匹配\w
的字符,而另一侧则没有(字符串的一端或匹配\W
的字符)。现在,\w
包含数字和_
之类的内容。如果你搜索含糊不清的单词,至少我往往不会将数字和下划线视为单词的一部分。我经常喜欢明确说明我正在寻找什么,例如通过外观断言:(?<!\p{L})
是一种指定在匹配中当前点之前没有字母的方法,实际上是在\b
开头的替换。图案。同样,(?!\p{L})
可用于模式末尾的\b
。当像这样写它们时,您可以更好地控制您认为适合您所寻找事物的“边界”,例如:也许你只想在它被空格限制时找到foo
:(?<![^\S])foo(?![^\S])
(请注意这里的双重否定,因为前瞻和后瞻只能是负数,因此它们也可以在字符串的开头和结尾处起作用)。