带引号的正则表达式

时间:2015-01-26 12:18:04

标签: regex autoit

我找到了很好的Regexp。 我把这个文本作为输入:

settings= ShouldAppears1
setting_ -> "ShouldAppears2"
setting__ = 'ShouldAppears3' #ShouldNotAppear
setting___ = "MissingEndQuote.ShouldNotAppears

结果我想得到一个数组:

[0] =>  settings=ShouldAppears1
[1] =>  settings=ShouldAppears2 or [1] =>  settings="ShouldAppears2"
[2] =>  settings=ShouldAppears3 or [2] =>  settings="ShouldAppears3"

我遇到了一些麻烦,因为如果有一个缺失的结尾报价,我不想要一个结果,而且我找不到后退参考。

到目前为止我得到的是这个正则表达式:

(?i)([A-Z_]{3,}\s{0,1}[=><-]{1,2}\s{0,1}(['"]?).+?\2)

问题是我得到了这个输出:

0 => settings= A
1 => 
2 => setting_ = "Appears"
3 => "
4 => setting__ = "Appears"
5 => "
6 => setting___ = "
7 => 

我希望看不到第1,3,5,7行,但我不能做(?=)非捕获组,但仍然可以使用后引用。

感谢您的帮助,

修改

我无法真正改变在脚本中调用regexp的方式我只能在Regexp上工作。结果只是全局匹配,而不是全局匹配。如果我改变你的正则表达式:

(?i)(\w+\s*(?:=|->)\s*(?:("|')\w+\g{2}|\w+))

我得到了

0 => settings= ShouldAppears1
1 => setting_ -> "ShouldAppears2"
2 => "
3 => setting__ = 'ShouldAppears3'
4 => '

这几乎是完美的但有没有办法摆脱[2]和[4]?即设置(“|”)未捕获但仍能够返回引用它?

1 个答案:

答案 0 :(得分:1)

如果你可以使用反向引用:

(?i)(\w+)\s*(?:=|->)\s*(("|')\w+\g{3}|\w+)

捕获组0匹配整个键值对 捕获组1匹配键 捕获组2匹配该值 捕获组3匹配报价,双引号或无匹配