繁体   English   中英

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

[英]Regex to match words with hyphens and/or apostrophes

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

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

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

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

使用这种模式

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

演示

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

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

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

debuggex.com 是可视化此类事物的绝佳资源

\\b\\w*[-']\\w*\\b应该可以解决问题

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

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

我相信在 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。

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

演示

我想这些词不应该匹配:

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

这对我有用:

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

利用

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

它将正确解析“You've and we've i've it''98”(在单词的任何地方都支持'但忽略单个' )。 如果需要\w可以替换为[a-zA-Z]等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM