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次的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章