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