2012-09-19 67 views
2

我有一個正則表達式的問題正則表達式幫助高級

我需要驗證預先給定的定義字符串用戶檢查是否有該字符串沒有錯誤。我在測試下進行了單元測試,以便您可以查看哪些字符串必須匹配,哪些不匹配。 什麼我已經有了,適合大多數:

/^product:\[(.*?)\]|default:\[(.*?)\]$/ 

還是有什麼需要測試的是:必須不存在任何空格,這並不爲[]與之間的值數|必須在那裏。但不是在最後

return array(
     array(
      'default:[6_400]', 
      TRUE 
     ), 
     array(
      'default:[bla_bla]', 
      TRUE 
     ), 
     array(
      'default:[bla _ bla]', 
      TRUE 
     ), 
     array(
      'product:8[8_400]|default:[6_400]', 
      TRUE 
     ), 
     array(
      'product:8[8_400]|default:[6_400]|product:10[10_400]', 
      TRUE 
     ), 
     array(
      'product:8[8_400]|product:12 [12_400]|default:[6_400]', 
      FALSE 
     ), 
     array(
      'roduct:8[8_400]|product:12[12_400]|default[6_400', 
      FALSE 
     ), 
     array(
      'default:6_400', 
      FALSE 
     ), 
     array(
      'product:8[8_400]', 
      FALSE 
     ), 
     array(
      'product:8[8_400]default:[6_400]', 
      FALSE 
     ), 
     array(
      'product:8[8_400]|default:[6_400]|', 
      FALSE 
     ), 
    ); 

回答

1

看着y我們的例子中,我想你的意思,括號內您要字的字符或空格(你可能不希望#$%^ & &,空和其他類似的東西)...

\[[\w\s]+\] 

這顯然可以由以下任一產品處理:編號或默認值:

((product:\d+)|(default:))(\[[\w\s]+\]) 

子句必須用|但匹配的字符串不能以'|'結尾

((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$) 

這可以發生一次或多次

(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+ 

,我們必須至少有一個完整的,合法的違約條款:

(?=.*?default:\[[\w\s]+\])(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+ 

,並填補了整條生產線:

^(?=.*?default:\[[\w\s]+\])(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+$ 

這裏是在acti在http://regexr.com?3275i

注意,因爲我還沒有列入允許白空間​​的任何地方比在括號外,沒有什麼特別需要的任何圖案來完成,禁止它的支架之外

另外請注意,我創建許多捕捉組(爲了簡單/可讀性),但是你可以通過放置它來消除它們:在任何之後(你不想捕捉)。這有點提高了性能。除了在regexr.com測試的東西,這個網站往往是有助於學習/構建正則表達式:

http://www.regular-expressions.info/

+1

感謝這次幫助我的迴應,閱讀和理解的確很不錯。 – Bennydog

0

試試這個正則表達式:

/^(?=.*?default)(?:(?:product|default):\d*\[[^\]]*\](?:\|(?!$)|$))+$/ 

查看rubular

如果你想排除default可能會出現在[],作爲而Gabber指出的可能性,你可以使用:

/^(?:product:\d*\[[^\]]*\]\|)?(?:default:\d*\[[^\]]*\](?:\|(?!$)|$))(?:product:\‌​d*\[[^\]]*\](?:\|(?!$)|$))?$/ 
+0

報價_And爲什麼產品:8 8_400] FALSE _ – Gabber

+0

我更新了正則表達式,讓'默認'是強制性的...... – morja

+0

這種方式默認也可以在'[]'('product:[default]'會好的) – Gabber