2016-05-13 128 views
2

我基於變量的結果即時創建正則表達式。我已經成功地測試了大部分表達式,但是我正在努力處理可能長度不同的部分。正則表達式匹配部分或全部字符串

我該如何修改正則表達式(a_)?c(davison)\.nsf?以便下面的任何字符串都可以歸類爲匹配項?

  • a_cdavis.nsf
  • cdavison.nsf
  • cdaviso.nsf
  • cdavis.nsf

從本質上講,被認爲是一個匹配,字符串必須符合下列條件 -

  1. 「(a_)?」 - 可以開始與「A_」,但不必
  2. 「C」 - 必須包含小寫字母「c」
  3. 「(戴維森)」 - 位,我不能做 - 必須包含的部分或全部「戴維森」,從頭開始(因此「DAV」是可以接受的,但「兒子」是不是)
  4. 「 NSF」 - 必須以「.NSF」說完
  5. 長度 - 長度不超過12個字符,包括可選的「_a 「在字符串的開始和字符串末尾所需的」.nsf「。

任何提示和技巧將不勝感激。

回答

4

要使的davison可選各部分,使用嵌套任選的基團(?:...)?),並設置長度的限制,則可以使用在開始錨定的負先行失敗比賽如果13個字符被發現(從而,(?!.{13})將使大小的12個字符的字符串):

^(?!.{13})(a_)?c(d(?:a(?:v(?:i(?:s(?:on?)?)?)?)?)?)\.nsf$ 

regex demo

+2

這會不會也匹配'cson.nsf'? Quote:「(所以」dav「是可以接受的,但」兒子「不是)」我認爲你需要'(d(a(v(...)?)?)?)?' –

+0

是否預期?如果不是,並且這些字母應該總是跟着另一個,那麼'^(?!。{13})(a _)?c(d(?:a(?:v(?:i(?:s(?:on? )?)?)?)?)?)\。nsf $'可以提供幫助。 –

+0

這取決於語言是什麼。在JS中,它會[這樣的](https://jsfiddle.net/rsLngq2g/)。 –