在特定位置的模式中找不到子字符串的正则表达式

问题描述 投票:0回答:1

我正在尝试为 linter 构建一个(多行)模式,以捕捉以下情况:

  1. Text(
    声明
  2. not后跟
    .appFont(
    声明...
  3. ...在下一次出现
    }
    (函数结束)或
    Text(
    (另一个文本声明...)之前

在使用 regex101(并咨询 gpt...)数小时后,我得到了这些 2:

Text\([\s\S]*?\)[\s\S]*?(?!\.appFont)

这只是捕捉到

.appFont
之前的部分,但如果发现
.appFont
,我希望整个捕捉失败...

Text\([\s\S]*?\)[\s]*?(?!appFont)[\s\S]\}

这只是抓住了一切,忽略了

appFont
完全处于刺中......

在下面的例子中,只有第二种情况应该被捕获:

Text("blah") 
  .appFont(.body)
}

Text("blah") 
}

Text(
  "blah"
)
.appFont(.blah)
}

我试图阅读有关负面前瞻的内容,但我认为我仍然以某种方式错误地使用它,或者以某种方式导致它在我添加时被忽略

[\s\S]
也许?

regex regex-negation swiftlint
1个回答
3
投票

使用否定字符类negativelookahead.

Text\([^)]*\)(?:(?!\.appFont)[^}])*}

在 regex101 看到这个演示 - 有点类似于tempered greedy token.

或者在关闭后仅使用一次前瞻断言
正则表达式 解释
Text
匹配子串
\([^)]*\)
匹配
(
然后是任意数量
)
否定类直到下一次关闭
)
(?:(?!\.appFont)[^}])*}
(?:
非捕获组
)
重复
*
任意数量 包含:
(?!\.appFont)
A neg. lookahead 如果子串 }
不领先。 
消耗
成功每个匹配字符最多
\.appFont

}
.

)

regex101 的另一个演示
 - 在这里甚至可能更有效率。

正则表达式解释Text\([^)]*\)(?![^}]*?\.appFont)[^}]*} Text任何数量)look\.appFont
匹配子串

匹配
\([^)]*\)
然后是
(直到下一次关闭)

否定。先行(
condition
):
如果(?![^}]*?\.appFont)不领先,[^}]*?\.appFont匹配
lazily
任意数量
non-[^}]*?直到子串}

如果条件成功(不是提前)消耗
任意数量
[^}]*}直到}


© www.soinside.com 2019 - 2024. All rights reserved.