【问题标题】:Oniguruma Regex - Match entire group content and not just the last occurrenceOniguruma Regex - 匹配整个组的内容,而不仅仅是最后一次出现
【发布时间】:2014-03-05 15:42:07
【问题描述】:

我正在为 Sublime Text 编辑器(使用 Oniguruma 正则表达式定义)编写语法荧光笔。基本上,我有这样的东西:

正则表达式: \((\w+\s*)*\)

测试: (how are you)

捕获组: 1. you

我的问题是,只有捕获组中的最后一次匹配(因此突出显示)而不是捕获组的全部内容。

在我的具体情况下:

正则表达式: \(\w+(\s+(\?\w+\s+)+-\s+(\w+))*\)

测试: (at ?l - location ?x - object)

捕获组:

1. ?x - object
2. ?x
3. object

但是,我想匹配整个组的内容,像这样:

1. ?x - object AND ?l - location
2. ?x AND ?l
3. object AND location

【问题讨论】:

  • 我不确定我是否理解。对于给定的匹配,单个捕获组只会分配一个值。当您在组匹配中写“AND”时,您是说您希望这两个值同时保存在 \1、\2 和 \3 中,还是只是希望文字值是“?x - object ?l - 位置”、“?x ?1”和“对象位置”?
  • 是的,我希望在一个捕获组中同时保存两个(或更多)值(但显然这是不可能的)。我的问题是,只有?xobject 在我的示例中突出显示,但我想为?x?l 分配一种颜色,为objectlocation 分配另一种颜色(并相应地在我的第一个示例中,我想强调 howareyou 而不仅仅是 you)。

标签: regex sublimetext2 oniguruma


【解决方案1】:

正则表达式确保找到所有事件,而不仅仅是最后一个。

(?:\(at |(?!^)\G)(?:(?=(?:(?!\(at ).)*\))[^?\w])*?(?:(?<token1>\?\w+)|(?<token2>\w+))

演示

http://regex101.com/r/rF8pM2

从您的示例中,您将 ?l?x 在名为 token1 的命名捕获组中。 objectlocation 可以通过命名的捕获组 token2 访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2016-06-01
    • 2016-09-21
    • 1970-01-01
    • 2020-06-04
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多