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

sqyvllje  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(97)

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

  1. Text(声明
    1.也就是not后跟.appFont(声明...
    1....在下一次出现}(函数结束)或Text((另一个Text声明...)之前
    在regex101上花了几个小时(并咨询了gpt...),我得到了以下两个:
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]也许?

but5z9lq

but5z9lq1#

使用否定字符类和 negativelookahead

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

See this demo at regex101-有点类似于tempered greedy token。
| 正则表达式|解释|
| --------------|--------------|
| Text|匹配子串|
| \([^)]*\)|匹配(,后跟非)any amount * 否定类 * 直到下一个关闭)|
| (?:(?!\.appFont)[^}])*}|(?:non capturing group)重复*any amount次,包含:(?!\.appFont)一个 neg.lookahead,它在每个非}的前面检查子字符串\.appFont是否不在前面- * 消耗 * 成功时每个匹配字符,直到}|
或者在关闭)后只使用一次lookaheadAssert。

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

Another demo at regex101-在这里甚至可能更有效。
| 正则表达式|解释|
| --------------|--------------|
| Text|匹配子串|
| \([^)]*\)|匹配非)(,然后是any amount,直到下一个关闭)|
| (?![^}]*?\.appFont)|neg. lookahead(condition):look如果[^}]*?\.appFont不在前面,其中[^}]*?匹配非}lazilyany amount,直到子字符串\.appFont|
| [^}]*}|如果条件成功(它不是提前)消耗any amount的非}}|

相关问题