【问题标题】:Regex match if first instance of string is followed by string -- force lazy如果字符串的第一个实例后跟字符串,则正则表达式匹配 - 强制延迟
【发布时间】:2016-10-02 05:07:07
【问题描述】:

仅当字符串的第一个实例后跟另一个字符串时,我才尝试返回匹配项。但是它们可能稍后会出现,但我不想要匹配。

Thing #1
.........
hidden=true
.........
Thing #2
.........
hidden=false
.........

现在我正在使用Thing #1[\S\s]*?hidden=false,但很明显,当我不想要它时,它会返回上述示例的匹配项。仅当第一个 hidden= 后跟 false 时。我知道如何使用捕获组来完成,但这对我来说会使事情变得非常复杂,我在 Android 上使用 Tasker,捕获组是一个巨大的考验并且速度很慢。我该怎么做?

【问题讨论】:

  • 如何找到第一次出现的 "hidden=" 并检查它后面的字符串是真还是假。正则表达式似乎有点矫枉过正。
  • @Kelvin 这可能不是第一次出现。我关心“Thing #1”之后的第一次出现。稍后这些将混合在一起,我也会对其他的感兴趣。
  • 然后找到“Thing #1”的索引,然后从“Thing #1”的索引之后找到第一个出现的“hidden=”。
  • @Kelvin 鉴于我正在使用 Tasker,这已经比仅使用缓慢而复杂的捕获组更复杂。
  • 嗯,如果捕获组很慢,那么前瞻将更加令人担忧:)

标签: regex tasker


【解决方案1】:

你已经接近了。您只需要防止另一个Thing #1 位于匹配的事物和下一个标记之间。

使用负面的展望:

Thing #1((?!Thing #1)[\S\s])*?hidden=false

【讨论】:

  • 啊,好吧,我想你的意思是Thing #1((?!hidden)[\S\s])*?hidden=false 以防止在第一个隐藏之前发生任何隐藏。完美。
【解决方案2】:

如果后面是hidden=false,则此否定正则表达式将在文本中搜索第一个Thing #<number> 实例:

^.*?Thing #\d+(?:(?!hidden=(?:true|false))[\S\s])*?hidden=false

如果先找到hidden=true,则不会有任何匹配。

RegEx Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2011-09-02
    • 2019-08-26
    • 2012-09-17
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多