PCRE,用 *SKIP *F 匹配表达式

PCRE, match expression with *SKIP *F

在这两种模式中:

1: abc)
2: a(bc)

我正在尝试创建一个匹配字符串 1 和 return NULL(如果与字符串 2 匹配)的模式。即仅当存在一个右括号而没有左括号时才匹配。如果右括号和左括号都存在,则 return NULL。所以我正在尝试:

~/ % pcretest
PCRE version 8.45 2021-06-15

  re> "(.*?)\((*SKIP)(*F)|.*?\)"
data> "abc)"
 0: "abc)
data> "a(bc)"
 0: bc)

表达式确实跳过了 "a(bc) 中的左括号,但我希望它为 return NULL。我该怎么做?

正在将我的评论转换为答案,以便未来的访问者可以轻松找到解决方案。

这个问题不需要使用花哨的 PCRE 功能,因为它可以使用带有否定字符的标准正则表达式解决 class(假设我们没有遇到嵌套或转义括号的复杂情况):

^[^(]*\)

RegEx Demo

解释:

  • ^: 开始
  • [^(]*:匹配0个或多个除(
  • 以外的任何字符
  • \):匹配右边)

使用递归模式,可以在括号不平衡时匹配)

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\)
  • ( 捕获 组 1
    • \( 匹配 (
    • (?:[^()]++|(?1))* 可选择重复匹配除 () 之外的任何字符或重复第一个子模式(第 1 组)
    • \) 匹配 )
  • ) 关闭组 1
  • (*SKIP)(*F) 跳过比赛
  • |
  • \)匹配单个)

Regex demo