簡體   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