regex - 正则表达式非重复二元组
问题描述
我想要一个 PCRE 正则表达式来创建类似于这个问题的二元组配对,但没有重复的单词。
Full Match: apple orange plum
Group 1: apple orange
Group 2: orange plum
我最接近它的是这个,但第二组中没有捕获“橙色”。
(\b.+\b)(\g<1>)\b
解决方案
你正在寻找这个:
/(?=(\b\w+\s+\w+))/g
这是一个快速的 perl 单行代码来演示它:
$ perl -e 'while ("apple orange plum" =~ /(?=(\b\w+\s+\w+))/g) { print "$1\n" }'
apple orange
orange plum
这在捕获组周围使用零宽度前瞻 (?=…)
,以确保我们可以两次读取“橙色”一词。
如果我们/(\b\w+\s+\w+)/g
改为使用,我们会得到“apple orange”,但不会得到第二个匹配项,因为正则表达式的从左到右处理已经超过了单词“orange”
如果我们省略单词 break \b
,正则表达式解释器会给我们“apple orange”,然后是“pple orange”、“ple orange”等……包括“orange plum”,还有“range plum”到“e李子”,因为这些都满足该标准。
推荐阅读
- mysql - 根据另一列中的值按 column1 或 column2 对行进行排序
- java - 价值提供者
BigTable 的 InstanceID 和 TableID 的管道未接受 - python - CentOS Python,mod_wsgi 无法正常工作
- kubernetes - 使用 Pulumi 创建 Kubernetes Service 导致错误无法为与 Service 关联的 Endpoint 对象创建观察者
- python-3.x - 如何在 tensorflow 2 数据集中使用带有元组的地图?
- javascript - 使用 redux 更好的方法启动数据
- spring-boot - Javers findChanges() 方法在使用 @Transactional 注释的方法中使用时抛出异常
- youtube-api - 如何解决 Youtube 数据 API 错误
- java - 当 Java 对象变得太大时会发生什么?
- html - 在多个浏览器上滚动移动菜单时出现问题