2012-03-25 104 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 ] +)“']