如何仅 select 前瞻匹配

How to only select the lookahead matches

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

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

.(?<=[^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)

知道如何 NOT-select 括号之间的部分吗?

我已经设置了一个正则表达式测试器: https://regex101.com/r/fYDm2L/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()] - 你可以用它的固定(没有括号)形式替换它。

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

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

demo