正则表达式条件正向展望

Regex conditional positive lookahead

提问人:NulisDefo 提问时间:2/17/2020 最后编辑:Pavneet_SinghNulisDefo 更新时间:2/17/2020 访问量:112

问:

我目前正在尝试使用正则表达式,试图更好地掌握它们,并且有一个我现在似乎很挣扎的场景,因为我不知道这是否可以通过正则表达式实现。

我有这样的文本字符串

$array['key']['FirstWord']
$array['key']['FirstWord SecondWord']
$array['key']['FirstWord SecondWord ThirdWord']
$array['key']['FirstWord SecondWord ThirdWord FourthWord']

该清单可能正在进行中。我想匹配(选择)内部关键字之间的空格。因此,在第二行中,它将是 和 之间的空格。FirstWordSecondWord

有了,我能够匹配键中包含多个单词的行。把第一部分作为积极的展望,我能够在关键词开始之前放上“标记”,然后我就迷路了。我正在考虑使用单词边界,然后在它们之间选择任何东西,但到目前为止还没有成功。有什么建议或指示吗?^\$array\['key'\]\['(?:\w+ +)+(?<=^\$array\['key'\]\[')

编辑: 假设这些行之间也会有一些其他文本,因此 simple 不能用作正则表达式。\b

表达 式正则表达式-环视

评论


答:

4赞 The fourth bird 2/17/2020 #1

如果支持,则可以使用锚点来获取迭代匹配项,从而在上一场比赛结束时断言位置。\G

您匹配任何一个字符,或者再匹配 1 个单词字符,而忘记当前匹配的内容^\$array\['key'\]\['\K

然后匹配 1 个或多个水平空格字符。

(?:^\$array\['key'\]\['(?=.*?'])\w+|\G(?!^))\w+\K\h+
  • (?:非捕获组
    • ^\$array\['key'\]\['火柴$array['key']['
    • (?=.*?'])积极向前看,向右断言']
    • \w+匹配 1+ 个单词字符
    • |
    • \G(?!^)在上一场比赛结束时断言位置,而不是在开始时断言位置
  • )关闭非捕获组
  • \w+匹配 1+ 个单词字符
  • \K重置报告匹配项的起点(忘记匹配项)
  • \h+匹配 1+ 水平空格字符

正则表达式演示

评论

0赞 JvdV 2/17/2020
不错,+。你介意解释一下不同的部分吗?我第一次看到等等。\GK
0赞 The fourth bird 2/17/2020
当然,我现在正在吃午饭,但几分钟后我会添加它。
0赞 NulisDefo 2/17/2020
因此,在我玩了一会儿之后,据我所知,在上一场比赛之后的每个字符之后设置锚点,然后从您匹配的单词后跟空格的字符中设置锚点。怎么会这样?\G
0赞 NulisDefo 2/17/2020
如果不支持,有什么替代建议吗?\G
0赞 The fourth bird 2/17/2020
@NulisDefo 还有其他选项,例如,如果支持无限宽度模式的后视,则可以使用 regex101.com/r/vcA169/1 但此匹配范围更广一些。(?<=^\$array\['.*) (?=.*?\])