【问题标题】:Java: Regular expression where each character occurs 0-1 timesJava:每个字符出现0-1次的正则表达式
【发布时间】:2013-07-29 18:41:55
【问题描述】:

问题:

  1. 匹配正则表达式的每个字符最多出现一次的单词。

  2. 单词必须有一定的大小,比如说“{2,5}”

  3. 单词中必须有一个特定的字符,比如 char "e"

我有什么:

word.matches("^[abcde]{2,5}$");

这匹配字符 a、b、c、d 和 e 出现 0..5 次的所有单词。因此,即使“abba”两次使用字符“b”而“dead”两次使用字符“d”,单词“abba”和“dead”也会匹配。如果字符“e”在单词中,表达式也会忽略。

我想要的是一个匹配,其中每个字符最多使用一次,单词长度为 2-5 个字母,字符“e”在单词中。例如,合法匹配将是“珠子”,因为每个字符最多使用一次,并且字符“e”在单词中。

【问题讨论】:

  • 那将是一个复杂的正则表达式。我建议根本不要使用正则表达式。正则表达式不能“在字符串中的任何位置匹配一次”。

标签: java regex word match


【解决方案1】:

你可以使用如下表达式:

^(?=[abcd]*e)(?:([abcde])(?![abcde]*?\1)){2,5}$

一些cmets:

^
(?=[abcd]*e)     # make sure there is an "e"
(?:
  ([abcde])      # match a character and capture it
  (?!            # make sure it's not repeated
    [abcde]*?
    \1           # reference to the previously matched char
  )
){2,5}
$

【讨论】:

  • 似乎工作,我认为它会更复杂。不错的答案+1。
  • @RohitJain, # comments 在使用 (?x) 或等效标志时是正则表达式字符串中的有效 cmets。所以请把那些留在里面。Docs.
  • @Qtax。对 Perl 来说是正确的。不适用于 Java。您不能使用(?x) 将正则表达式字符串分成多行,您必须使用正常的字符串连接。
  • 感谢您的帮助。问题第2部分和第3部分由此解决!然而,关于每个字符只出现一次的第 1 部分没有。例如“ebba”和“bedda”是匹配的。
  • @Lillem4n,我猜你没有正确引用它。 (输出/打印字符串,看看你得到了什么。)引用时,你需要用另一个反斜杠转义反斜杠。喜欢:"^(?=[abcd]*e)(?:([abcde])(?![abcde]*?\\1)){2,5}$"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2021-12-12
相关资源
最近更新 更多