为了账号安全,请及时绑定邮箱和手机立即绑定

在Regex中重叠匹配

在Regex中重叠匹配

红糖糍粑 2019-08-28 14:36:47
在Regex中重叠匹配我似乎无法找到这个问题的答案,我想知道是否存在。简化示例:考虑一个字符串“nnnn”,其中我想找到“nn”的所有匹配 - 但也是那些彼此重叠的匹配。因此正则表达式将提供以下3个匹配:nn nnñ NN ñnn nn我意识到这并不是正则表达式的意思,但是对字符串进行操作并手动解析它似乎是一个非常多的代码,考虑到实际上匹配必须使用模式而不是文字字符串来完成。
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

一个可能的解决方案可能是使用积极的外观

(?<=n)n

它会给你最终的位置:

  1. * N ***ñ** NN  

  2. N * N ***ñ** N  

  3. NN * N ***ñ**


正如Timothy Khouri所提到的 ,积极的前瞻更为直观

我更喜欢他的命题(?=nn)n更简单的形式:

(n)(?=(n))

这将引用您想要的字符串的第一个位置并将捕获组(2)中的第二个n

那是因为:

  • 可以在前瞻中使用任何有效的正则表达式。

  • 如果它包含捕获括号,则将保存反向引用

因此,组(1)和组(2)将捕获'n'表示的任何内容(即使它是复杂的正则表达式)。


查看完整回答
反对 回复 2019-08-28
?
SMILET

TA贡献1796条经验 获得超4个赞

使用具有捕获组的前瞻工作,代价是使正则表达式更慢,更复杂。另一种解决方案是告诉Regex.Match()方法,下一次匹配尝试应该从哪里开始。试试这个:

Regex regexObj = new Regex("nn");Match matchObj = regexObj.Match(subjectString);while (matchObj.Success) {
    matchObj = regexObj.Match(subjectString, matchObj.Index + 1); }


查看完整回答
反对 回复 2019-08-28
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

AFAIK,没有纯正的正则表达方式一次做到这一点(即返回你请求的三个捕获没有循环)。

现在,您可以找到一次模式,并以offset(找到位置+ 1)开始循环搜索。应该将正则表达式与简单代码结合使用。

[编辑]太棒了,当我基本上说Jan所示的时候,我被投票了... 
[编辑2]要明确:Jan的答案更好。不是更精确,但肯定更详细,值得选择。我只是不明白为什么我的被投票,因为我仍然没有看到任何错误。没什么大不了的,只是讨厌。


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 687 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信