c# - Regex 词边界表达式

标签 c# regex

例如,我有以下字符串 "one two(three) (three) four five" 并且我想用 替换 "(three)" >“(四)” 但不在字内。我该怎么做?

基本上我想做一个正则表达式替换并以以下字符串结束:

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

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

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

基本上我正在编写一些搜索和替换代码,并为用户提供了匹配大小写、匹配整个单词等的常用选项。在这种情况下,用户选择了匹配整个单词,但我不知道文本是什么搜索将是。

最佳答案

您的问题源于对 \b 实际含义的误解。不可否认,这并不明显。

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

  • \b 表示:单词字符非单词字符之间的边界。
  • 字母(例如 a-z)被视为单词字符
  • ( 等标点符号被视为非单词字符

这里又是你的输入字符串,稍微拉长了一点,我标记了 \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
↑     ↑ ↑     ↑ ↑         ↑     ↑         ↑   ↑       ↑ ↑       ↑

正如您在这里看到的,在“two”和“(three)”之间有一个\b,但在第二个“(three)”之前没有。

故事的寓意?如果您要搜索的不仅仅是一个词(一串字母),那么“全词搜索”就没有多大意义。由于您的搜索字符串中有标点符号(括号),因此它不是这样的“词”。如果您搜索仅由 单词字符 组成的单词,则 \b 会执行您期望的操作。

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

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

但是,这个问题当然是,如果您搜索“three”(没有括号),它不会在“(three)”中找到那个,因为它周围没有空格,即使它实际上是一个完整的单词。

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

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

这样即使你选择“whole words only”,他们也会找到“(three)”。

关于c# - Regex 词边界表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3468102/

相关文章:

c# - 图标透明度问题

c# - 在 C# 中使用 DirectShow 的 2 个视频

c# - Datagridview 错误 System.IndexOutOfRangeException : Index 0 does not have a value

sql - 检查支架是否平衡/匹配

regex - PowerShell - 在管道字符上拆分

c# - 如何使用C#以编程方式更改Windows 10 Display Scaling

javascript - 如何在正则表达式中使用变量?

javascript - 简单的 Coderbyte 挑战计算 x 和 o 时遇到问题

正则表达式 - 基于匹配内值的匹配长度(使用变量?)

c# - WCF:App.config 中的配置是否比自定义代理类中的硬编码更好?