我想匹配一些分组的东西,但也要用逗号分隔.我需要他们不要再重复.我以为我知道了,但当事情开始变得奇怪时,我决定问问.这些搜索项目是超级简化的,因为在真实的搜索中,有各种各样的特定字符和单词,以及特殊字符和转义字符.这就是为了让这个例子可以被用来询问.

`{A=1,B=2,C=3}`
`{B=2,A=1,C=3}`
`{C=3,B=2,A=1}`

这就是我所try 的:

    ^\{(?:(?:A=1,?)()|(?:B\=2,?)()|(?:C\=3,?)()){3}\1\2\3\}$

这使用一些非捕获组,然后是空的捕获组,以处理唯一性.我不确定这是不是正确的做法,因为这感觉更像是一个客厅把戏,但这是我能找到的让我走到这一步的东西.

如果它们的顺序不同,则会成功

`{B=2,A=1,C=3}`

它不匹配重复项(因为它不应该匹配) {A=1,B=2,A=1}

遗憾的是,当逗号丢失时,它将匹配(不是预期的). {A=1B=2C=3}

我确实知道,?要么得到逗号,要么没有逗号,但在这种情况下,如果没有最后一个逗号,我就不知道怎么做了.尤其是以这种奇怪的方式配对的时候.

推荐答案

我明白,?得到逗号或什么都没有,但我不知道如何在这种情况下,在最后一个上没有它.

这里的关键是,无论您是否需要逗号,它都是与上下文相关的.当输入中的下一个字符是}(但您的模式仍然允许)时,您do not想要它,否则您do想要它.您可以使用先行断言来实现这一点:,(?!\})匹配后面不跟}的逗号,而(?=\})匹配下一个字符是}的逗号.两者都没有捕捉到任何东西.综合起来,(?:,(?!\})|(?=\}))实现了,?无法实现的目标.

完整的模式是:

^\{(?:(?:A\=1(?:,(?!\})|(?=\})))()|(?:B\=2(?:,(?!\})|(?=\})))()|(?:C\=3(?:,(?!\})|(?=\})))()){3}\1\2\3\}$

这保留了捕获空组的技巧,以确保每个备选方案匹配一次,而不复制单个项目.

Java相关问答推荐

为什么我的画布没有显示在PFA应用程序中?

使用动态ID从json获取详细信息的Jolt规范

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

如何调整工作时间日历中的时间

SpringBoot+Java 17@Valid未验证POJO

如何使用值中包含与号的查询参数创建一个java.net.URI

Bean定义不是从Spring ApplationConext.xml文件加载的

Java Mooc.fi Part 12_01.Hideout -返回和删除方法

泛型与泛型问题的完美解决方案?

如何在SWT菜单项文本中保留@字符

没有Tomcat,IntelliJ如何在本地运行API?

在Java Spring JPA中插入包含对其他实体的引用的列

在Spring Boot中使用咖啡因进行缓存

Java System.getProperty在哪里检索user.home?

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

spring 更新多项管理关系

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

在数组中查找素数时出现逻辑错误

获取月份';s在java中非UTC时区的开始时间和结束时间