正则表达式词边界表达式

Cro*_*Man 25 c# regex

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

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

"one two(three) (four) four five"
Run Code Online (Sandbox Code Playgroud)

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

@"\b\(three\)\b"
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*mwi 55

你的问题源于对\b实际意义的误解.不可否认,这并不明显.

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

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

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

 o n e   t w o ( t h r e e )   ( t h r e e )   f o u r   f i v e
?     ? ?     ? ?         ?     ?         ?   ?       ? ?       ?
Run Code Online (Sandbox Code Playgroud)

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

这个故事的主旨?如果您要搜索的内容不仅仅是一个单词(一串字母),那么"全字搜索"并没有多大意义.由于搜索字符串中有标点符号(括号),因此它不是"单词".如果您搜索的单词只包含单词字符,那么\b就可以达到预期效果.

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

(^|\s)\(three\)(\s|$)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Dom*_*rrs 6

这是您可能感兴趣的简单代码:

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

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