我是regex的新手,我正在尝试验证用户输入的字段是否以逗号分隔的格式输入周末,并且该日使用2个字符的缩写。我开发了以下无法正常运行的模式:
^(fr | sa | su | mo | tu | we | th)?(?(1)(,fr |,sa |,su |,mo |,tu |,we
|,th)){0,5} $
此模式成功匹配所需的输入,如下所示:
fr
莫
fr,sa
fr,tu
su,mo,tu,我们,fr,sa
但它也匹配以下错误的输入:
fr,fr,fr,fr
sa,sa,sa,sa
我想要一种强制第二组重复仅包含在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演示。
该(?!.*\b([a-z]{2})\b.*\b\1\b)
是负先行失败的比赛,如果有是字符串中重复的两个字母块。
Java演示:
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重复一个字符串n次,包括了Java重复一个字符串n次的使用技巧和注意事项,需要的朋友参考一下 示例 问题:创建一个String包含的n重复项String s。 琐碎的方法将反复地将 String 这会创建n包含1的新字符串实例,以n重复s生成,导致运行时为。O(s.length() * n²) = O(s.length() * (1+2+...+(n-1)+n)) 为了避免这
问题内容: 在Perl中,我可以使用以下语法多次重复一个字符: 有没有简单的方法可以在Javascript中完成此操作?我显然可以使用一个函数,但是我想知道是否有任何内置方法或其他一些巧妙的技术。 问题答案: 如今,字符串方法几乎在所有地方都已实现。它不在InternetExplorer中。)因此,除非需要支持较旧的浏览器,否则只需编写以下内容: 在之前,我们使用了此技巧: (请注意,长度为11的
问题内容: 如何编写一个与相同字符(或理想情况下,同一组)的N个重复恰好匹配的表达式?基本上是做什么的,但是有一个重要的限制:如果主题重复N次 以上, 则表达式应该失败。例如,给定和字符串,表达式应该匹配和不。 我不专注于任何特定的方言,可以随意使用任何语言。请不要发布仅适用于此特定示例的代码,我正在寻找一个通用的解决方案。 问题答案: 使用负前瞻 和 负后瞻。 这将是正则表达式:除了Python
问题内容: 今天早些时候,我需要一次遍历2个字符的字符串,以解析格式如下的字符串(有一些额外的字母)。 我最终完成了这个工作,但是看起来很丑。我最终评论了它在做什么,因为它感觉不太明显。几乎看起来像是pythonic,但并非完全如此。 有一些更好/更清洁的方法可以做到这一点吗? 问题答案: 邓诺关于清洁剂,但还有另一种选择: 无副本版本:
我有两个字符串str1和str2。我试图用字符把一些字母从一个字符串复制到另一个字符串。我知道我可以使用字符串复制,但我想要一些字符,而不是全部字符。 在Java中,如何将子字符串从一个字符串复制到另一个字符串?
我面临着与Java的匹配器的其他问题。我试图使用正则表达式匹配我的JSON的内容,而不使用外部库。我的JSON看起来像这样: 但是,我只想匹配上半部分中的单词,即在第一个匹配。我试图创建一个新的模式和匹配器,但我不知道如何进行,也不知道如何在第一次出现