正则表达式 - 括号内的所有内容

时间:2016-03-15 10:19:10

标签: 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

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

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

尝试这种模式:

/^(.*?)(?:and)(.*)(?:and)(.*)$/

并替换为:

$1 zzz $2 zzz $3

Online Demo

答案 1 :(得分:2)

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

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

因此,请使用

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

请参阅regex demo

简而言之,

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