2017-07-22 25 views
1

我已經試過了很多關於如何在html5模式的正則表達式函數中使用負面lookbehind和lookahead的正則表達式指南。在html5模式中使用負向lookbehead和lookahead

我想匹配以下模式,其中字符串必須以[a-z]字母開頭和結尾。該字符串最長可以有30個字符。也可以包含符號:-,但是它不能連續超過一個-

的sooo,我想出了到目前爲止是這樣的:

^[a-z][a-z(?<!-(-)?!-)]{0,28}[a-z]$ 

現在我無法得到先行和回顧後使正常工作,我不太清楚,如果我正確地實現了最多30個字符。不過,我試過從[a-z]開始和結束,它工作正常。

一些示例字符串:

'a-b' => true 
'a-' => false 
'-a' => false 
'a--b' => false 
'ab-cd' => true 
'abc' => true 
'a-b-c' => true 
+0

嘗試'^ [A-Z] +({31}?!)(: - [A-Z] +)* $'。不清楚你是否只想匹配'abc-xyz-def'和'aaaaaa'這樣的字符串,或者'a - ()*^a'也是有效的。請添加一些您允許的字符串示例,一些您不允許。 –

+0

@WiktorStribiżew甜,看起來像它的工作,你能解釋你使用的結構嗎?它和我用過的東西很相似。 – PhyCoMath

+0

@WiktorStribiżew查看更新以獲取允許字符串的一些示例。 – PhyCoMath

回答

2

您需要使用

^(?!.{31})[a-z]+(?:-[a-z]+)*$ 

regex demo

注意的是,在HTML5 模式屬性,錨通常不需要爲該模式默認情況下錨定在兩側。

詳細

  • ^ - 串的開始
  • (?!.{31}) - 不可能有大於換行符字符其它31個字符(這(?!...)是負先行失敗如果模式匹配的匹配) (您也可以使用積極的lookahead - (?=.{1,30}$) - 需要字符串中有1到30個字符)
  • [a-z]+ - 1個或更多小寫ASCII字母
  • 012 -個
  • (?:-[a-z]+)*的零個或更多序列:
    • - - 連字符
    • [a-z]+ - 1或多個小寫字母ASCII
  • $ - 字符串的結尾。
+0

您是否有時間在0或更多的章節序列中解釋'?:'的功能? – PhyCoMath

+0

請參閱[什麼是非捕獲組?問號後跟冒號(?:)是什麼意思?](https://stackoverflow.com/questions/3512471)當我們不需要訪問子匹配值時,它用於分組目的。例如。卡西米爾的模式可以寫成'^(?:[a-z] | \ b- \ b){1,30} $'。 –

+0

謝謝,我會看看你提供的鏈接:) – PhyCoMath

3

您可以使用此模式:

([a-z]|\b-\b){1,30} 

詞的邊界防止連字符是連續的,或者是在字符串的限制。

請注意,^$在模式屬性中不需要,因爲它們是隱含的。

demo

+0

有一些框架可以覆蓋常規的HTML5模式行爲,因此將錨定保留在應該在的位置可能是一個好主意。 –

+1

@WiktorStribiżew:問題是關於html5,而不是任何框架。如果框架本身無法錨定模式,則不應使用它。 –

+0

我不知道HTML5中包含這些錨,在每種情況下都不包括這些錨的原因是什麼? – PhyCoMath

相關問題