【问题标题】:Regular expression with quotes带引号的正则表达式
【发布时间】:2015-03-24 20:35:16
【问题描述】:

我在寻找好的正则表达式时遇到了一些麻烦。 我得到这个文本作为输入:

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 行,但我不能做一个 (?=) 非捕获组,但仍然可以使用反向引用。

感谢您的帮助,

编辑

我无法真正更改脚本中正则表达式的调用方式,我只能处理正则表达式。结果只是全局匹配,而不是全局完全匹配。如果我通过以下方式更改您的正则表达式:

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

我明白了

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

这几乎是完美的,但有没有办法摆脱 [2] 和 [4]?即设置 ("|') 不被捕获但仍然可以反向引用它?

【问题讨论】:

    标签: regex autoit


    【解决方案1】:

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

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

    捕获组 0 匹配整个键值对。
    捕获组 1 匹配密钥。
    捕获组 2 匹配该值。
    捕获组 3 匹配引号、双引号或什么都不匹配

    【讨论】:

    • 感谢您的回复。我想要的是只有第 0 组。我编辑我的帖子让你更好地理解
    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多