当单词以方括号等特殊字符开头或结尾时,单词边界不匹配
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 => 演示
我想用另一个数字替换方括号中的字符串。我正在使用正则表达式替换方法。
示例输入:
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 时,最好使用 - 不可能依赖单词边界,
\b
,因为该结构的含义取决于直接上下文。
Regex.Escape
方法完成
您可以使用
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 => 演示