正则expression式匹配一个字与唯一的(非重复)字符
我正在寻找一个正则expression式,只有在它的所有字符都是唯一的时候才会匹配,也就是说,这个字中的每个字符只出现一次。
例如 :
abcdefg
– >将返回MATCH
abcdefgbh
– >将返回不匹配 (因为字母b
重复多次)
试试这个,它可能工作,
^(?:([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 «(?:([AZ])(?!.*\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 «([AZ])» Match a single character in the range between “A” and “Z” «[AZ]» 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) «$»
您可以检查string中是否有两个字符的实例:
^.*(.).*\1.*$
(我只是简单地捕捉其中一个angular色,并检查是否在其他地方有反向引用,剩下的.*
就不在意了)。
如果上面的正则expression式匹配,则string具有重复字符。 如果上面的正则expression式不匹配,那么所有的字符都是唯一的。
上面的正则expression式的好处是当正则expression式引擎不支持环顾四周。
显然John Woo的解决scheme是直接检查唯一性的一种很好的方法。 它在每个字符上断言前面的string不会包含当前字符。
这一个也将提供一个完整的匹配任何长度不重复的字母:
^(?!.*(.).*\1)[az]+$
我稍微修改了@Bohemian提供给另一个问题的答案 。
上面这个问题已经有一段时间了,但是我认为在这里也有这个正则expression式是很好的。