【问题标题】:regex to match entire words containing only certain characters正则表达式匹配仅包含某些字符的整个单词
【发布时间】:2012-05-23 03:50:24
【问题描述】:

我想匹配仅包含已定义字符的整个单词(或真正的字符串)。

例如,如果字母是dog

dog = match
god = match
ogd = match
dogs = no match (because the string also has an "s" which is not defined)
gods = no match
doog = match
gd = match

在这句话中:

dog god ogd, dogs o

...我希望匹配 doggodo(不是 ogd,,因为逗号或 dogs,因为 s

【问题讨论】:

    标签: regex


    【解决方案1】:

    这应该对你有用

    \b[dog]+\b(?![,])
    

    说明

    r"""
    \b        # Assert position at a word boundary
    [dog]     # Match a single character present in the list “dog”
       +         # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
    \b        # Assert position at a word boundary
    (?!       # Assert that it is impossible to match the regex below starting at this position (negative lookahead)
       [,]       # Match the character “,”
    )
    """
    

    【讨论】:

      【解决方案2】:

      以下正则表达式表示您要查找的三个字符出现一次或多次:

      [dog]+
      

      解释:

      方括号表示:“任何括起来的字符”。

      加号表示:“前一个表达式出现一次或多次

      这将是完全相同的事情:

      [ogd]+
      

      【讨论】:

        【解决方案3】:

        您使用的是哪种正则表达式风格/工具? (例如 JavaScript、.NET、Notepad++ 等)如果它支持前瞻和后瞻,您可以这样做:

        (?<!\S)[dog]+(?!\S)
        

        这样,您将只能获得位于字符串开头或前面有空格、或位于字符串结尾或后面有空格的匹配项。如果您不能使用lookbehind(例如,如果您使用JavaScript),您可以拼出前导条件:

        (?:^|\s)([dog]+)(?!\S)
        

        在这种情况下,您将从组 #1 中检索匹配的单词。但不要采取下一步并尝试用(?:$|\s) 替换前瞻。如果这样做,第一个命中(“dog”)将占用尾随空格,并且正则表达式将无法使用它来匹配下一个单词(“god”)。

        【讨论】:

          【解决方案4】:

          根据语言,这应该可以满足您的需求。它只会与您上面所说的相符;

          这个正则表达式:

          [dog]+(?![\w,])
          

          在一串..中

          dog god ogd, dogs o
          

          只会匹配..

          dog, god, and o
          

          Example in javascript

          Example in php

          两个[](括号)之间的任何东西都是一个字符类。它会匹配括号之间的任何字符。您也可以使用范围。[0-9][a-z] 等,但它只会匹配 1 个字符。 +* 是量词。+ 搜索 1 个或多个字符,而 * 搜索零个或多个字符。您可以使用大括号 ({}) 指定明确的字符范围,在其间放置一个数字或多个数字:{2} 将仅匹配 2 个字符,而 {1,3} 将匹配 1 或 3。

          () 括号之间的任何内容都可用于回调,例如您想要返回或使用返回的值作为字符串中的替换。这 ?!是负前瞻,它不会匹配它之后的字符类,以确保当字符存在时,带有字符的字符串匹配。

          【讨论】:

          • [\w\b,] 不正确。在字符类中,\b 匹配退格,而不是单词边界。为什么有人会想匹配退格,我不知道,但是一个字符类应该一次只消耗一个字符,而单词边界 \b 不消耗任何东西。
          • 我没有意识到这一点。修复。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-05
          • 1970-01-01
          • 1970-01-01
          • 2017-07-21
          • 2017-07-08
          相关资源
          最近更新 更多