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(假设我们没有遇到嵌套或转义括号的复杂情况):
^[^(]*\)
解释:
^
: 开始
[^(]*
:匹配0个或多个除(
以外的任何字符
\)
:匹配右边)
使用递归模式,可以在括号不平衡时匹配)
。
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\)
(
捕获 组 1
\(
匹配 (
(?:[^()]++|(?1))*
可选择重复匹配除 (
和 )
之外的任何字符或重复第一个子模式(第 1 组)
\)
匹配 )
)
关闭组 1
(*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(假设我们没有遇到嵌套或转义括号的复杂情况):
^[^(]*\)
解释:
^
: 开始[^(]*
:匹配0个或多个除(
以外的任何字符
\)
:匹配右边)
使用递归模式,可以在括号不平衡时匹配)
。
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\)
(
捕获 组 1\(
匹配(
(?:[^()]++|(?1))*
可选择重复匹配除(
和)
之外的任何字符或重复第一个子模式(第 1 组)\)
匹配)
)
关闭组 1(*SKIP)(*F)
跳过比赛|
或\)
匹配单个)