2012-03-25 113 views
0

我有這個正則表達式應該匹配1 ='aa'或1 =「aa」或1 = aa,並返回數字/值。匹配,直到正則表達式表達不正確

(?<number>\d)=\s*("|')?\s*(?<value>.*?)(?=("|')?\d=|$) 

它的工作原理,但它返回的值不正確。號回來爲1,但價值爲AA」中的1 =的情況下,‘AA’

如何,我可以得到價值= AA爲1 =的情況下,‘AA’。

實際表現可能含有1 = 'AA' 2 = 「BB」 3 = CC等

回答

3

這裏的主要問題是,這樣的:

(?=("|')?\d=|$) 

裝置「後面是任何以下的:

  • "加上一個數字加=
  • '加上一個數字加=
  • 一個數字加=
  • 結束串

」。你會注意到,而不是允許"'與數字之間的空格;所以在1="aa" 2=...的情況下,value根本不是允許的之後是" 2=...。同樣,而不是可以爲"'加上字符串結尾。

所以最小的解決辦法是讓—不,需要 —數字之前的一些空白,並移動("|')?出前向斷言,進入正則表達式的主要部分:

("|')?(?=\s+\d=|$) 

捐贈:

(?<number>\d)=\s*("|')?\s*(?<value>.*?)("|')?(?=\s+\d=|$) 

雖然我們在這,我們不妨做一些其他的調整,以簡化正則表達式和減少案件的數量在那裏可以去WRO NG:

(?<number>\d)=\s*(["']?)(?<value>.*?)\1(?=\s+\d=|$) 

(進一步清理是可能的,但我不知道有足夠的瞭解您的數據,建議更多的變化)

+0

謝謝它正常工作當您從SO複製,也複製了新線等它不是正常工作感謝您的幫助 – 2012-03-26 00:11:03

+0

@AlexJ?。。:不客氣! – ruakh 2012-03-26 00:11:42

0

嘗試

(?<number>\d)=\s*("|')?\s*(?<value>.+?)("|')?(\s|$) 

它會工作,如果分配後面跟着一個空格或一個行尾。

+0

我編輯了我的答案,因爲我以前的解決方案只適用於單個作業。 – 2012-03-25 21:44:15

1

保持簡單。最簡單和可讀的方式來匹配完全一對引號(它們是相同的,例如,不喜歡的有:1='aa")如下:

(
(
    (?P<number>\d)="(?P<value>[^"]+)"  #or * in stead of + if value can be empty 
) | 
(
    (?P<number>\d)='(?P<value>[^']+)'  #or * in stead of + if value can be empty 
) | 
(
    (?P<number>\d)=(?P<value>[^\s]+)  #here you should also choose where you stop 
) 
) 
0

其他項目要考慮:

  • 你的原始表達式(但不是你的例子)似乎是旨在支持空白附近等號。
  • 你的號碼是否需要支持多位數字?
  • 使用方括號可選字符可避免不必要的捕捉組

    (?<數> \ d +)\ S * = \ S * [ 「']?(?<值> [^」'\ S ] +)「']