比方说,我有以下字符串"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表示:单词字符和非单词字符之间的边界.(被视为非单词字符.这是你的输入字符串,延伸了一点,我已经标记了\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)
这样他们就会找到"(三)",即使你只选择"整个单词".
这是您可能感兴趣的简单代码:
string pattern = @"\b" + find + @"\b";
Regex.Replace(stringToSearch, pattern, replace, RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)