正则表达式 - 除了括号内的任何内容之外的所有内容

标签 regex expression pcre

假设:

fieldA=20 and (fieldB=date() and (fieldC=35 and fieldD=40)) and fieldE = 100

我正在尝试替换外部的“和”词,例如:

fieldA=20 zzz (fieldB=date() and (fieldC=35 and fieldD=40)) zzz fieldE = 100

我已经尝试了几个小时,但没有成功。我可以找到一些关于如何将所有内容放入括号或方括号内的答案。下面的表达式将所有内容都放在括号内,但我实际上不知道如何编写一个忽略这一点的表达式:

\(([^()]*+|(?R))*\)    # retrieves "(fieldB=date() and (fieldC=35 and fieldD=40))"

如有任何帮助,我们将不胜感激。

最佳答案

您的 \(([^()]*+|(?R))*\) 模式包含整个模式递归构造 (?R) 允许匹配嵌套括号及其内的所有内容。您需要的是省略与此子模式匹配的所有内容,并将 作为它们之外的整个单词进行匹配。我们需要将整个子模式放入捕获组中,并将 (?R) 替换为 (?1) 以仅递归第一个捕获组模式,而不是整个模式。

(*SKIP)(?!) 构造可用于省略 PCRE 正则表达式中当前匹配的替代项。

因此,使用

(\(([^()]*+|(?1))*\))(*SKIP)(?!)|\band\b

请参阅regex demo

简而言之,

  • (\(([^()]*+|(?1))*\))(*SKIP)(?!) - 将嵌套括号与里面的所有内容匹配,省略此匹配文本并继续分析字符串
  • | - 或...
  • \band\b - 匹配并返回整个单词

关于正则表达式 - 除了括号内的任何内容之外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36008438/

相关文章:

java - 匹配邮政信箱地址的正则表达式

regex - 如何在正则表达式中接受空格?

Python 正则表达式否定回顾

php - 需要防止 PHP 正则表达式段错误

php - PHP 使用哪种正则表达式算法?

java - 正则表达式匹配 Java 字符串开头的一个单词

php - 在评论中查找不同样式的日期

javascript - 为什么 |匹配正则表达式中的每个字符串

c++ - 构建数学表达式求值器

c# - 强类型 url 操作