34

我正在寻找一个正则表达式,它只有在它的所有字符都是唯一的情况下才会匹配一个单词,这意味着单词中的每个字符只出现一次。

示例
abcdefg-> 将返回MATCH
abcdefgbh -> 将返回NO MATCH(因为字母b重复多次)

4

3 回答 3

57

试试这个,它可能会工作,

^(?:([A-Za-z])(?!.*\1))*$

解释

Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Match the regular expression below «(?:([A-Z])(?!.*\1))*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
   Match the regular expression below and capture its match into backreference number 1 «([A-Z])»
      Match a single character in the range between “A” and “Z” «[A-Z]»
   Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!.*\1)»
      Match any single character that is not a line break character «.*»
         Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
      Match the same text as most recently matched by capturing group number 1 «\1»
Assert position at the end of a line (at the end of the string or before a line break character) «$»
于 2012-10-13T06:22:07.850 回答
12

您可以检查字符串中是否有 2 个字符实例:

^.*(.).*\1.*$

(我只是简单地捕获一个角色并检查它是否在其他地方有一个带有反向引用的副本。其余的.*都是无关紧要的)。

如果上面的正则表达式匹配,则字符串具有重复字符。如果上面的正则表达式不匹配,则所有字符都是唯一的。

上面的正则表达式的好处是正则表达式引擎不支持环顾四周。

显然,John Woo 的解决方案是一种直接检查唯一性的好方法。它在每个字符处断言前面的字符串将不包含当前字符。

于 2012-10-13T06:14:33.127 回答
3

这也将提供与不重复字母的任何长度单词的完全匹配:

^(?!.*(.).*\1)[a-z]+$

不久前,我稍微修改了@Bohemian 提供的另一个问题的答案以获得这个

自从提出上述问题以来也已经有一段时间了,但我认为在这里也有这个正则表达式模式会很好。

于 2017-10-26T21:56:55.373 回答