Java:每个字符出现0-1次的正则表达式

Posted

技术标签:

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

问题:

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

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

    单词中必须有一个特定的字符,比如 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”在单词中。

【问题讨论】:

那将是一个复杂的正则表达式。我建议根本不要使用正则表达式。正则表达式不能“在字符串中的任何位置匹配一次”。 【参考方案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$"

以上是关于Java:每个字符出现0-1次的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

带字符串的正则表达式:出现两次的字母对[关闭]

Java正则表达式

正则表达式学习整理

JS正则表达式从入门到入土—— 量词

正则表达式

教你从零开始学习java正则表达式