作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是正则表达式的新手,我正在尝试验证用户以逗号分隔格式输入周末的字段,并使用当天的 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 。
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/
我是一名优秀的程序员,十分优秀!