正则表达式匹配带连字符和/或撇号的单词

时间:2015-08-10 02:45:36

标签: javascript regex

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

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

这大部分时间都有效,但如果有撇号和连字符,比如" qu' est-ce"它就不匹配。我可以添加更多的选项,但也许还有另一种更有效的方法吗?

我想要匹配的一些例子:玛丽,高中,钱伯斯,Qu' est-ce。

5 个答案:

答案 0 :(得分:11)

使用此模式

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

source code

(?=                 # 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)

答案 1 :(得分:7)

答案 2 :(得分:4)

[\w'-]+几乎可以匹配任何带有(或没有)连字符和撇号的单词,但也适用于那些字符相邻的情况。 (?:\w|['-]\w)+应匹配字符不能相邻的情况。

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

答案 3 :(得分:1)

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

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

我认为在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开头和结尾的任何单词,并且可以包含零个或多个一个或一个连字符后跟一个或多个alpha的组。

答案 4 :(得分:0)

如何:\'?\w+([-']\w+)*\'?

demo

我认为这些词不应该匹配:

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