正则表达式词边界表达式

比方说,我有以下字符串"one two(three) (three) four five" ,我想用"(four)"替换"(three)" "(four)"而不是在单词内。 我该怎么办?

基本上我想做一个正则表达式替换并最终得到以下字符串:

 "one two(three) (four) four five" 

我尝试了以下正则表达式,但它不起作用:

 @"\b\(three\)\b" 

基本上我正在写一些搜索和替换代码,并给用户通常的选项来匹配大小写,匹配整个单词等。在这个例子中,用户选择匹配整个单词,但我不知道被搜索的文本将是什么是。

你的问题源于对\b实际意味着什么的误解。 不可否认,这并不明显。

\b\(three\)\b与输入字符串中的\b\(three\)\b匹配的原因如下:

  • \b表示: 单词字符非单词字符之间的边界。
  • 字母(例如az)被认为是单词字符
  • 标点符号如(被认为是非单词字符)

这是你的输入字符串,延伸了一点,我已经标记了\b匹配的地方:

  onetwo ( three ) ( three ) fourfive ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 

正如你在这里看到的,在“两个”和“(三个)”之间有一个\b ,但不是在第二个“(三个)”之前。

这个故事的主旨? 如果您要搜索的内容不仅仅是一个单词(一串字母),那么“全字搜索”并没有多大意义。 由于搜索字符串中有标点符号(括号),因此它不是“单词”。 如果您搜索仅包含单词字符单词 ,那么\b将按预期执行。

当然,只有当字符串被空格包围或出现在字符串的开头或结尾时,您才能使用不同的正则表达式匹配字符串:

 (^|\s)\(three\)(\s|$) 

然而,问题当然是,如果你搜索“三”(没有括号),它将找不到“(三)”中的那个,因为它周围没有空格,即使它实际上是一个完整的词。

我想大多数文本编辑器(包括Visual Studio)只有在搜索字符串实际开始和/或以单词字符结尾时才会使用\b

 var pattern = Regex.Escape(searchString); if (Regex.IsMatch(searchString, @"^\w")) pattern = @"\b" + pattern; if (Regex.IsMatch(searchString, @"\w$")) pattern = pattern + @"\b"; 

这样他们就会找到“(三)”,即使你只选择“整个单词”。

这里有一个您可能感兴趣的简单代码:

  string pattern = @"\b" + find + @"\b"; Regex.Replace(stringToSearch, pattern, replace, RegexOptions.IgnoreCase); 

源代码: snip2code – C#:替换句子中的确切单词

我最近在javascript中遇到了类似的问题,试图将条款与前导’$’字符仅作为单独的单词匹配,例如,如果$ hot =’FUZZ’,则:

 "some $hot $hotel bird$hot pellets" ---> "some FUZZ $hotel bird$hot pellets" 

正则表达式/\b\$hot\b/g (我的第一个猜测)不起作用的原因与parens在原始问题中不匹配 – 作为非单词字符,在它们之前没有单词/非单词边界用空格或字符串开头。

然而正则表达式/\B\$hot\b/g 确实匹配,这表明在@ timwi的优秀示例中标记的位置与\ B术语匹配。 这对我来说并不直观,因为") ("不是由正则表达式字符组成。但我想因为\ B是\ b类的反转,它不一定是单词字符,它只是必须不是 – 不是字符:)

正如Gopi所说,但(理论上)只捕捉(three)而不是two(three)

 string input = "one two(three) (three) four five"; string output = input.Replace(" (three) ", " (four) "); 

当我测试时,我得到: "one two(three) (four) four five"只记得白空间也是一个字符串字符,所以它也可以被替换。 如果我这样做:

 //use same input string output = input.Replace(" ", ";"); 

我得到one;two(three);(three);four;five"