【问题标题】:Regex to match words with hyphens and/or apostrophes正则表达式匹配带有连字符和/或撇号的单词
【发布时间】:2022-04-21 00:15:50
【问题描述】:

我正在寻找一个正则表达式来匹配带有连字符和/或撇号的单词。到目前为止,我有:

(\w+([-'])(\w+)?[']?(\w+))

这在大多数情况下都有效,但如果有一个撇号,然后是一个连字符,比如“qu'est-ce”,它就不匹配了。我可以附加更多选项,但也许还有另一种更有效的方法?

我尝试匹配的一些示例:Mary's, High-school, 'tis, Chambers', Qu'est-ce。

【问题讨论】:

  • 再看一遍, (\w+([-'])(\w+)?[-']?(\w+)) 大部分时间都可以满足我的需要好奇是否还有其他方法。
  • 请举出更多的例子和反例。以下哪项应该匹配:"-a""'a""a'-b""a-"
  • @torazaburo 不需要数学,但几乎可以使用任何欧洲语言中的任何单词。我可以根据需要添加字符。

标签: javascript regex


【解决方案1】:

使用这种模式

(?=\S*['-])([a-zA-Z'-]+)

Demo

(?=                 # Look-Ahead
  \S                # <not a whitespace character>
  *                 # (zero or more)(greedy)
  ['-]              # Character in ['-] Character Class
)                   # End of Look-Ahead
(                   # Capturing Group (1)
  [a-zA-Z'-]        # Character in [a-zA-Z'-] Character Class
  +                 # (one or more)(greedy)
)                   # End of Capturing Group (1)

【讨论】:

  • 我不知道lookhead,它看起来不错。一个解释会很好。 :) 但我可以阅读它。也许是唯一能保证始终匹配的模式。
  • @empedocle,添加了解释
  • 谢谢。我还发现 Introducing Regular Expressions 中对前瞻的解释很有帮助。
  • 不错的一个 :) 我也没有理解前瞻,但这很好地解释了它。
【解决方案2】:

[\w'-]+ 几乎可以匹配任何出现的带有(或不带有)连字符和撇号的单词,但在这些字符相邻的情况下也是如此。 (?:\w|['-]\w)+ 应该匹配字符不能相邻的情况。

如果您需要确保单词包含连字符和/或撇号并且这些字符不相邻,请尝试\w*(?:['-](?!['-])\w*)+。但这也将匹配 ' 和 - 单独。

【讨论】:

  • 像个老板(Y)
【解决方案3】:

【讨论】:

    【解决方案4】:

    您遇到的问题是您实际上有三种可能的子模式:一个或多个字符、一个撇号后跟一个或多个字符,以及一个连字符后跟一个或多个字符。

    这假定您不希望接受以撇号或连字符开头或结尾的单词,或者在撇号旁边有连字符(反之亦然)。

    我相信在 RegExp 中表示这一点的最佳方式是:

    /\b[a-z]+(?:['-]?[a-z]+)*\b/
    

    描述为:

    \b                   # word-break
    [a-z]+               # one or more
    (?:                  # start non-matching group
      ['-]?              # zero or one
      [a-z]+             # one or more
    )*                   # end of non-matching group, zero or more
    \b                   # word-break
    

    将匹配以 alpha 开头和结尾的任何单词,并且可以包含零个或多个组的 apos 或连字符,后跟一个或多个 alpha。

    【讨论】:

    • 我编辑的问题,我认为在你回答之前已经改变,确实包括像'tis and Chambers'这样的例子。从另一个答案来看,前瞻似乎会捕获所有情况,因为我正在尝试匹配英语中可能出现的任何单词,包括我还没有想到的情况。
    【解决方案5】:

    怎么样:\'?\w+([-']\w+)*\'?

    demo

    我想这些词不应该匹配:

    • something--something:以 - 开头或结尾
    • some--thingsome'-thing: - 后面没有字符
    • some'':两个连字​​符

    【讨论】:

      【解决方案6】:

      这对我有用:

      ([a-zA-Z]+'?-?[a-zA-Z]+(-?[a-zA-Z])?)|[a-zA-Z]
      

      【讨论】:

        【解决方案7】:

        使用

        ([\w]+[']*[\w]*)|([']*[\w]+)
        

        它会正确解析 “你有,我有''98” (在单词的任何位置支持',但忽略单个')。 如果需要 \w 可以替换为 [a-zA-Z] 等。

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 2023-03-26
          • 2019-05-28
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多