2016-02-27 41 views
2

我正在嘗試創建一個正則表達式。的規則是:JavaScript:正則表達式 - 不能用標點符號開始/結束,不要重複標點符號

1)僅字母(上部和下部),數字,句點()和下劃線(_)

2)必須開始並以字母或數字(即,沒有周期/下劃線結束)

3)不能有多個標點符號一排,任何形式的(無..或._或_。或__或.._。等)

4)必須至少包含2個字母(無論上限還是下限,或兩者都無關緊要)

5)不少於3個字符,不超過25個字符字符

到目前爲止,我所擁有的是:

^((?!.*[\._]{2})[A-Za-z0-9\._]{3,25})$ 

,接近十歲上下。我有規則1,3和5,但想不通2和4

我認爲

(([A-Za-z0-9]?)([A-Za-z0-9\._]+)([A-Za-z0-9]?)){3,25} 

將獲得規則2,但它只是打破它。

我一直在爲此工作了幾個小時,但沒有找到任何解決方案,或者可以提出的解決方案都是我所需要的。

對您提供的正則表達式的解釋將不勝感激,但並非完全必要。

EDIT 1

作爲每小白的建議:

^((?!.*[\._]{2})(([\w\d\.]+)){3,25})$ 

編輯2

有效:

1rockit.man 
q3w 
e4.45r.d.2 
sp_am 

(和任何3到25個字符之間的東西,而不會導致或重複標點符號)

無效:

.ret. 
123 
12a 
ret..wer 
super_.duper 
_petrat 
petrat_ 
+1

使用'shorthand'像'\ w'和'\ D'運營商。更容易理解。 '\ w'也包含'_',這樣就可以覆蓋。 – 2016-02-27 06:17:33

+0

您可能希望包含一些**有效**和**無效**匹配以進行快速測試。 – 2016-02-27 06:27:00

+0

根據條件2,'1rockit.man'和'e4.45r.d.2' ** **無效**。_不能以非字母/數字_開始或結束。您可能想再次檢查給定的條件或示例。 – 2016-02-27 06:37:19

回答

4

構建從規則,正則表達式(在方便的順序):

  • 大寫和小寫=>使用不區分大小寫的標誌//i
  • 字母,數字,下劃線和句點=>[\w.]*
  • 3-25字符=>^[\w.]{3,25}$
  • 不能開始或週期結束或下劃線=>(?!^[\W_]|[W_]$)
    (通知大寫\W意思not \w
  • 不能包含2標點連續=>(?![\W_]{2})
  • 檢查負向前看每一個位置=>(?:(?!...)[\w.]){3,25}
    (使用非捕獲組(?:)而不是(),因爲我們不需要保存組)
  • 至少2個字母=>(?:.*[a-z]){2}假設i標誌
  • 渦捲到先行(未消耗任何字符),所以我們可以檢查多個條件=>(?=(?:...))

最終正則表達式字面:

/^(?=(?:.*[a-z]){2})(?:(?!^[\W_]|[\W_]{2}|[\W_]$)[\w.]){3,25}$/i 

https://regex101.com/r/yK1cB3/5#javascript


FTR:支持 x標誌的語言(忽略正則表達式中的空格),可以使它更易讀(見 workaround for javascript):

^ 
(?= 
    (?:.*[a-z]){2} 
) 
(?: 
    (?!^[\W_]|[\W_]{2}|[\W_]$) 
    [\w.] 
){3,25} 
$ 
+0

我該如何修改它以允許在開始和結束時標點符號(只是句點和下劃線)?我嘗試將中間部分改爲'(?:(!![\ W_] {2} $)[\ w。])',* *允許開始和結束標點符號,但它也允許連續多個標點符號。沒有'$'的 – Birrel

+1

... – Aprillion

+0

完美!謝謝。 (?=(?:。* [az]){2})(?:(?![\ W _] {2})[\ w。]){3,25} $/i',for任何其他可能想知道的人。 – Birrel

7

基於你的情況我想出了下面的正則表達式。它只是修改你當前的正則表達式。

正則表達式:^(?=.*[A-Za-z].*[A-Za-z])([A-Za-z0-9]((?!.*[\._]{2})([\w\d\.]{1,23}))[A-Za-z0-9])$

說明:

  • ,第一部分(?=.*[A-Za-z].*[A-Za-z])檢查整個字符串必須由什麼分離two字符(這幾乎是這裏的情況)。

  • 我添加上的開始和結束字符串檢查哪個應該是

  • 除此之外作爲第一和最後一個字符計數的長度的其餘部分將是僅23個字符長度將現在也有所不同。

Regex101 Demo

1

你可以嘗試使用:

^(?=.*[a-zA-Z].*[a-zA-Z].*)[a-zA-Z0-9](?!.*[._]{2,}|.*[._]$)[._a-zA-Z0-9]{2,24}$ 

,或者,如果你願意讓使用字符類,如\ W \ d \ S,你可以使用:

^(?=.*[a-zA-Z].*[a-zA-Z].*)\w(?!.*[._]{2,}|.*[._]$)(\w|[._]){2,24}$ 

http://regexr.com/3ct34

1

羚牛部分在你的謎語挑戰。這是我的版本。將有很好的表現,以及:)

/^(?=(?:.*?[a-z]){2})[a-z\d](?!.*?[._]{2})[\w.]{1,23}[a-z\d]$/i 

iflag爲區分大小寫匹配,其中[a-z]相當於阿爾法[a-zA-Z]
\w是字符[A-Za-z0-9_]short,因此[\w.]將匹配允許的字符。
(?:打開一個non capturing group主要用於repitition或alternation(如果組不需要)。
(?=(?!lookarounds是在某個位置觸發的零長度斷言。

  • 規則2:需要一個alnum [a-z\d]^開始和一個在$
  • 規則1 & 5:不小於3,不超過25與開始/結束中減去[\w.]{1,23}
  • 規則3: (?!.*?[._]{2})沒有連續的標點符號被負向預測檢查。
  • 規則4:(?=(?:.*?[a-z]){2})至少2個字母用正面向前看。

Check out demo at regex101

相關問題