gpt4 book ai didi

regex - 全字匹配(Visual Studio 风格)

转载 作者:行者123 更新时间:2023-12-01 11:05:30 26 4
gpt4 key购买 nike

我正在尝试将全字匹配搜索添加到我的小型应用程序中。我希望它做与 Visual Studio 相同的事情。因此,例如,下面的代码应该可以正常工作:

  public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

String input = "[ abc() *abc ]";

Match(input, "abc", 2);
Match(input, "abc()", 1);
Match(input, "*abc", 1);
Match(input, "*abc ", 1);
}

private void Match(String input, String pattern, int expected)
{
String escapedPattern = Regex.Escape(pattern);
MatchCollection mc = Regex.Matches(input, @"\b" + escapedPattern + @"\b", RegexOptions.IgnoreCase);
if (mc.Count != expected)
{
throw new Exception("match whole word isn't working");
}
}
}

搜索“abc”工作正常,但其他模式返回 0 个结果。我认为\b 不合适,但我不确定该使用什么。

如有任何帮助,我们将不胜感激。谢谢

最佳答案

\b 元字符匹配字母数字字符和非字母数字字符之间的单词边界。以非字母数字字符结尾的字符串最终无法匹配,因为 \b 按预期工作。

要执行支持两种数据类型的正确的全词匹配,您需要:

  • 在任何字母数字字符之前或之后使用\b
  • 在任何非字母数字字符之前或之后使用\B(大写B)
  • 如果模式的第一个或最后一个字符有意为非字母数字字符,则不要使用 \B,例如带有尾随空格的最后一个示例

基于这些要点,您需要有额外的逻辑来检查传入的搜索词以将其塑造成适当的模式。 \B 的工作方式与 \b 相反。如果您不使用 \B 那么您可能会错误地以部分匹配结束。例如,单词 foo*abc 会错误地与 @"\*abc\b" 模式匹配。

演示:

string input = "[  abc() *abc foo*abc ]";
string[] patterns =
{
@"\babc\b", // 3
@"\babc\(\)\B", // 1
@"\B\*abc\b", // 1, \B prefix ensures whole word match, "foo*abc" not matched
@"\*abc\b", // 2, no \B prefix so it matches "foo*abc"
@"\B\*abc " // 1
};

foreach (var pattern in patterns)
{
Console.WriteLine("Pattern: " + pattern);
var matches = Regex.Matches(input, pattern);
Console.WriteLine("Matches found: " + matches.Count);
foreach (Match match in matches)
{
Console.WriteLine(" " + match.Value);
}
Console.WriteLine();
}

关于regex - 全字匹配(Visual Studio 风格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com