2016-03-10 116 views
1

我很難合併兩個正則表達式。合併兩個正則表達式

,因爲我不是那麼熟悉,我寫的正則表達式separetely:

1)無字母可以是兩次以上連續的符號「'」和‘ - ’允許太:

^(?!.*([A-Za-z])\1{2})[-'A-Za-z]{3,50}$ 

2)不能有連續兩次允許的符號:

^(?!.*([A-Za-z])\1{2})[-'A-Za-z]{3,50}$ 

它修復了「 - 」和「‘’」的問題,但仍需要考慮到dissalow辦法「 - '「或」' - 「

我想將它們合併在一個,像這樣:

^(?!.*([A-Za-z])\1{2}|([-'])(?!\2))[-'A-Za-z]{3,50}$ 

但好像我的手被打破。請告訴我我的錯誤在哪裏?

我想達到的目標:

1)不超過2相同字母連續

通行證:TestTeest
失敗:Teeesttttest

2)不超過1個特殊(只有兩個是允許的 - '和 - )在一排符號。

通行證:Te-sttes't-test'testtest-test'T-e-s-t
未通過:Te--sttes''t-'test'-testtest'-

3)最低爲3個字母(特殊符號不計數),最大爲50個符號(特殊符號數

通行證:Te-s-ttes't-test'testtest-test'
未通過:te--tet-e't'

+0

你的意思是連續三個字母不能出現在一行,每個' '或'-'應該用字母包圍?試試'^(?!。*([A-Za-z])\ 1 {2})(?=。{3,50} $)[A-Za-z] +(?:[ - '] [ A-ZA-Z] +)* $'。沒有測試用例,檢查模式是否是你需要的是相當困難的。 –

+0

@WiktorStribiżew我用測試用例更新了我的問題 – Cheese

+0

正則表達式1)和2)似乎是相同的。 (你在規則中再次使用相同的編號,但我正在討論頂部附近的正則表達式。) – tripleee

回答

0

您可以使用

^(?!.*([A-Za-z])\1{2})(?=(?:[^a-zA-Z]*[a-zA-Z]){3,})(?!.{51})[-']?[A-Za-z]+(?:[-'][A-Za-z]+)*[-']?$ 

regex demo(與\n[^a-zA-Z]字符類僅用於演示目的)。

下面是說明:

  • ^ - 串的開始
  • (?!.*([A-Za-z])\1{2}) - 沒有3名相同的字母被允許在一行中
  • (?=(?:[^a-zA-Z]*[a-zA-Z]){3,}) - 至少3(兩者連續和非連續的)字母是必需的
  • (?!.{51}) - 字符串長度不能超過50個符號


    的零寬度檢查,現在端,消耗字符:
  • [-']? - 1或多個字母
  • (?:[-'][A-Za-z]+)* - - 0或更多個序列中的
  • [A-Za-z]+一個字符串的開頭一或零-'
    • [-'] - 一個'-
    • [A-Za-z]+ - 1+字母(這有效地禁止連續-'
  • [-']? - 一個或一個字符串的結尾零-'
  • $ - 字符串的結尾