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

emp*_*cle 9 javascript regex

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

(\w+([-'])(\w+)?[']?(\w+))
Run Code Online (Sandbox Code Playgroud)

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

我想要匹配的一些例子:Mary's,High-school,'tis,Chambers',Qu'est-ce.

alp*_*avo 16

使用这种模式

(?=\S*['-])([a-zA-Z'-]+)
Run Code Online (Sandbox Code Playgroud)

演示

(?=                 # 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)
Run Code Online (Sandbox Code Playgroud)


小智 5

[\w'-]+会匹配几乎所有出现(带有或不带有连字符和撇号)的单词,而且还会匹配那些字符相邻的情况。 (?:\w|['-]\w)+应该匹配字符不能相邻的情况。

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


Rob*_*sch 5

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

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

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

/\b[a-z]+(?:['-]?[a-z]+)*\b/
Run Code Online (Sandbox Code Playgroud)

其描述为:

\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
Run Code Online (Sandbox Code Playgroud)

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