【问题标题】:C# regex match only parts of complete words in stringC# 正则表达式仅匹配字符串中完整单词的一部分
【发布时间】:2009-05-04 16:30:49
【问题描述】:

在问这个问题之前,我已经在 Google 上搜索过这个问题,并查看了所有与 StackOverflow 相关的问题。

问题很简单

我有一个字符串“北大西洋公约组织”

我有一个模式“a.*z”,现在它会匹配

北大西洋公约组织

但我只需要它来匹配完整的单词(例如 orgANIZation)

我尝试过 "\baz\b" 和 "\Baz\B" 作为模式,但我觉得我不太明白

我应该如何更改我的模式以匹配字符串包含的完整单词(不匹配多个单词)

模式是动态生成的,用户输入 a*z,我的应用程序将其转换为匹配字符串中完整单词部分的模式。

我的问题是我不知道用户要搜索什么。理想情况下,我会在用户的表达式中添加一些正则表达式。

谢谢!

【问题讨论】:

  • 当前的解决方案很棒,但它们需要字符串解析,我正在寻找字符串前置/附加样式的解决方案。谢谢。

标签: c# .net regex


【解决方案1】:

orgANIZation 中的ANIZ 不是一个完整的词——它是一个词的一部分。顺便说一句,你的模式不是你写的——a*z 与你描述的不匹配;您可能正在使用a.*z,这会。所以,试试a[^ ]*z,这样它就不会匹配空格。如果您不想匹配除了空格之外的其他字符,例如一些标点符号,当然也可以将它们放在[^...] 结构中。

【讨论】:

    【解决方案2】:
    "a[^\s]*z"
    

    这意味着一个“a”后跟任意数量的非空白字符,然后是一个“z”。

    编辑:您似乎希望将“*”解释为通配符。因此,用户不要输入正则表达式,而是输入带有某些通配符的字符串。您可以通过推理预期的含义将这些通配符转换为正则表达式。假设 '*' 应该表示“零个或多个不是空格的字符”。然后用相应的正则表达式替换这个字符:

    [^\s]* `-.-´| 字符类-----´ `---零个或多个 '\s':“空白” 内部字符类:如果它以'^'开头:“不是”

    您可能还想定义“?”准确匹配单个非空白字符。这是相同的字符类,但您省略了末尾的“*”。

    因此,您要做的是将“*”正则表达式替换为“[^\s]*”,将“?”替换为“[^\s]”。

    【讨论】:

      【解决方案3】:

      这就是你要找的东西:

      new Regex( @"\b[^ ]*a[^ ]*z[^ ]*\b" );
      

      它只匹配一个单词(不允许有空格) - 但匹配整个单词。您可以将您的用户输入翻译成这样的正则表达式 - 只需将 * 替换为 [^ ]* - 它甚至可以使用多个通配符。

      【讨论】:

        【解决方案4】:

        与您的问题没有直接关系,但您可能需要查看 RegEx 可视化工具,该工具会根据文本输入和给定的正则表达式向您显示捕获的结果。

        这样的工具对于找到正确的模式非常有帮助,这可能非常棘手。 RegExLab 是专门用于 .net RegEx 的一个不错的工具,它有点老,但在显示正则表达式匹配的内容方面做得很好。由于该页面是德语的,因此只需单击 regexlab.006.zip 链接。源代码也包括在内。

        【讨论】:

        【解决方案5】:
        Regex reWord = new Regex("\\b[A-Za-z]*?(a.*z)[A-Za-z]*\\b");
        

        ...这将返回“大西洋条约组织”,来自 a.*z 的捕获是“antic Treaty Organiz”。

        问题是您的方法所固有的 - 除非您通过将 * 修改为 [ ^\s]*?正如 Svante 建议的那样(或者可能是 \w*?),你会吞噬比你喜欢的更多的角色。

        ".*" 一般而言,当您试图具体化时,这是一个坏主意。它将匹配除换行符之外的所有内容,并且您无法附加任何内容来阻止它。

        Regex reWord = new Regex("\\b\\w*?(a\\w*?z)\\w*\\b");
        

        ...将只返回“组织”。

        或者,如果您出于某种原因绝对必须避免修改用户提供的正则表达式,或许可以尝试将您的字符串拆分为一个单词数组并针对正则表达式单独测试每个单词。

        最终,它是 GIGO - 垃圾进,垃圾出。为您的系统提供一个错误的正则表达式,如果您没有适当地修复它,您将无法获得所需的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-08
          • 1970-01-01
          相关资源
          最近更新 更多