我找到了很好的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]?即设置(“|”)未捕获但仍能够返回引用它?
答案 0 :(得分:1)
如果你可以使用反向引用:
(?i)(\w+)\s*(?:=|->)\s*(("|')\w+\g{3}|\w+)
捕获组0匹配整个键值对 捕获组1匹配键 捕获组2匹配该值 捕获组3匹配报价,双引号或无匹配