gpt4 book ai didi

java - 如何在 OR 构造中强制匹配重复 n 次的不同字符串

转载 作者:行者123 更新时间:2023-11-30 06:06:20 28 4
gpt4 key购买 nike

我是正则表达式的新手,我正在尝试验证用户以逗号分隔格式输入周末的字段,并使用当天的 2 个字符缩写。我开发了以下模式,但没有按照我想要的方式工作:

^(fr|sa|su|mo|tu|we|th)?(?(1)(,fr|,sa|,su|,mo|,tu|,we|,th)){0,5}$

此模式成功匹配所需的输入,如下所示:

法国

法语、法语

法语、法语

苏、莫、图、我们、法国、萨

但它也匹配以下错误的输入:

法国,法国,法国,法国

萨,萨,萨,萨

我想要一种方法来强制第二组仅重复 OR 构造中包含的不同值。正则表达式有办法做到这一点吗?

最佳答案

您可以在正则表达式的开头使用 (?!.*([a-z]{2}).*\1) 否定前瞻来禁止字符串中重复 2 个字母值 (由于字符串格式,您甚至不需要在前瞻中进行单词边界或逗号上下文检查):

^(?!.*\b([a-z]{2})\b.*\b\1\b)(fr|sa|su|mo|tu|we|th)?(?:,(?:fr|sa|su|mo|tu|we|th)){0,5}$

请参阅regex demo .

(?!.*\b([a-z]{2})\b.*\b\1\b) 是一个否定的前瞻,如果存在重复,则匹配失败字符串中的两个字母 block 。

Java demo :

String day = "fr|sa|su|mo|tu|we|th";
String pattern = "(?!.*\\b([a-z]{2})\\b.*\\b\\1\\b)(?:" + day + ")?(?:,(?:" + day + ")){0,5}";
if (s.matches(pattern)) {
System.out.println("Valid!");
} else {
System.out.println("Invalid!");
}

请注意,String#matches 需要完整的字符串匹配,因此不需要 ^$

请注意,您可以使用字符类缩短day部分,fr|sa|su|mo|tu|we|th => fr|s[au]|mo|t[uh]|we

关于java - 如何在 OR 构造中强制匹配重复 n 次的不同字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51234694/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com