当前位置: 首页 > 面试题库 >

如何在n次构造中强制匹配另一个字符串重复n次

越伯寅
2023-03-14
问题内容

我是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看起来像这样: 但是,我只想匹配上半部分中的单词,即在第一个匹配。我试图创建一个新的模式和匹配器,但我不知道如何进行,也不知道如何在第一次出现