正则表达式将单词与唯一(非重复)字符匹配

时间:2012-10-13 06:11:06

标签: regex

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

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

3 个答案:

答案 0 :(得分:42)

试试这个,它可能有效,

^(?:([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) «$»

答案 1 :(得分:12)

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

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

(我只是简单地捕获其中一个角色,并检查它是否在其他地方有后备参考。其余的.*都不关心。

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

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

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

答案 2 :(得分:0)

这个也可以提供与非重复字母的任何长度字的完全匹配:

( |2-2| + |4-2| + |1-5| ) / 3

我稍后将@Bohemian提供的answer略微修改为另一个问题来解决这个问题。

由于上面提出的问题已经有一段时间了,但我认为在这里也有这个正则表达式模式会很好。