正则表达式词边界表达式
比方说,我有以下字符串"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"