当单词以方括号等特殊字符开头或结尾时,单词边界不匹配

Word boundaries not matching when the word starts or ends with special character like square brackets

我想用另一个数字替换方括号中的字符串。我正在使用正则表达式替换方法。

示例输入:

This is [test] version.

所需输出(用 1.0 替换“[test]”):

This is 1.0 version.

现在正则表达式没有替换特殊字符。下面是我试过的代码:

 string input= "This is [test] version of application.";

 string stringtoFind = string.Format(@"\b{0}\b", "[test]");

 Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

input 和 stringtoFind 变量中可能有任何特殊字符。

您应该转义括号并删除 \b:

 string input= "This is [test] version of application.";

 string stringtoFind = string.Format("{0}", @"\[test\]");

 Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

输出

This is 1.0 version of application.

重要提示

\b NOT 匹配空格。 \b 匹配单词开头或结尾的空字符串。也许您正在寻找 \s.

我猜这个简单的表达式可能会起作用:

\[[^]]+\]

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"\[[^]]+\]";
        string substitution = @"1.0";
        string input = @"This is [test] version";
        RegexOptions options = RegexOptions.Multiline;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}

表达式在 this demo, if you wish to explore/simplify/modify it, and in this link 的右上面板进行了解释,如果您愿意,您可以逐步观察它如何与一些示例输入进行匹配。

在我看来,这最接近您的要求:

string input = "This is [test] version of application.";

string stringtoFind = Regex.Escape("[test]");

Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

输出 This is 1.0 version of application..

但是,在这种情况下,只需这样做就足够了:

string input = "This is [test] version of application.";

Console.WriteLine(input.Replace("[test]", "1.0"));

它做同样的事情。

这里你必须考虑两件事:

  • 特殊字符必须使用文字 \ 符号进行转义,当您将动态文字文本作为变量传递给 regex
  • 时,最好使用 Regex.Escape 方法完成
  • 不可能依赖单词边界,\b,因为该结构的含义取决于直接上下文。

您可以使用 (see my YT video about these word boundaries):

string input= "This is [test] version of application.";
string key = "[test]";
string stringtoFind = $@"(?!\B\w){Regex.Escape(key)}(?<!\w\B)";
Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

您也可以使用 Regex.Escape 和明确的词边界 (?<!\w)(?!\w):

string input= "This is [test] version of application.";
string key = "[test]";
string stringtoFind = $@"(?<!\w){Regex.Escape(key)}(?!\w)";
Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

请注意,如果要替换包含空格的键字符串,请使用

string stringtoFind = $@"(?<!\S){Regex.Escape(key)}(?!\S)";
                         ^^^^^^                    ^^^^^
\] // Matches the ]
\[ // Matches the [

这是一个秘籍Sheet你以后可以用https://www.rexegg.com/regex-quickstart.html#morechars

string input = "This is [test] version of application.";

string stringtoFind = string.Format(@"\[[^]]+\]", "[test]");

Console.WriteLine(Regex.Replace(input, stringtoFind, "1.0"));

Console.ReadKey();

https://www.regexplanet.com/share/index.html?share=yyyyujzkvyr => 演示