如何只选择前瞻匹配

Posted

技术标签:

【中文标题】如何只选择前瞻匹配【英文标题】:How to only select the lookahead matches 【发布时间】:2019-12-30 01:29:51 【问题描述】:

我找到了一个很好的正则表达式,但我很难排除部分匹配项。

我想要的是选择括号,但前提是开始和结束括号之间有 1 个数字(多位数字)或单个字符,或者它们之间为空()。如果 () 前面有一些字符,则不应选择它。我用它来替换字符串的某些部分,因此我只想匹配括号,因为我想删除它们。当前的正则表达式匹配括号和其中的部分。

.(?<=[^a-z]\()([\d]*|[a-zA-Z])(?=\)).

(x+2)/(x)   -> only select ( ) in (x) 
-(2)+.      -> only select ( ) in (2)
(wsd).      -> select nothing
(x)^2+2     -> only select ( ) in (x)
sin(x).     -> select nothing
(22313)a.   -> only select ( ) in (22313)
+23-3()/(3x)+(x).  -> only select () in () and ( ) in (x)
sin(x)+3*x^2+(x)+23 -> only select ( ) in (x)

知道如何不选择括号之间的部分吗?

我已经设置了一个正则表达式测试器: https://regex101.com/r/fYDm2L/1

【问题讨论】:

请在您的问题中添加您使用的语言或工具的标签。单独的 [regex] 标签太宽泛了。 【参考方案1】:

Python 解决方案是:

x - 输入行

import re

for el in re.finditer(r"[YOUR REGEX HERE]", x):
     print(x[el.start():el.end()])
     x=x.replace(x[el.start():el.end()], x[el.start():el.end()].replace("(", "").replace(")", ""))

所以 - 从你的问题来看,我认为你的正则表达式工作正常(如果我错了,请纠正我)并且你只想替换括号,如果正则表达式匹配。

在这种情况下 - finditer 将遍历所有匹配的字符串,然后通过引用每个找到的短语:x[el.start():el.end()] - 您可以用它的固定(不带括号)形式替换它。

【讨论】:

是的 regExp 很好,我正在用 actionsctipt 写,想写: string.replace(regexp,"") 并删除括号....我想避免一个循环结果【参考方案2】:

不要尝试一次匹配一个括号,描述整个子字符串并使用可以在替换字符串中引用的捕获组:

var result:String = str.replace(/ (^|[^a-z]) \( (\d*|[a-z]) \) /gix, "$1$2");

demo

【讨论】:

哇,不知道有人能做到这一点——效果很好。谢谢:D

以上是关于如何只选择前瞻匹配的主要内容,如果未能解决你的问题,请参考以下文章

sed:具有反向前瞻匹配的嵌套组

正则表达式前瞻丢弃匹配

正则表达式之前瞻后顾(look around)

正则表达式忽略分组顺序匹配(前瞻后顾负前瞻负后顾的应用)

正则表达式第三回--模式分组与前瞻

javascript 正则表达式之分组与前瞻匹配详解