我正在寻找一个只有字符匹配的正则表达式,如果它的所有字符都是唯一的,这意味着单词中的每个字符只出现一次。
示例:
abcdefg
- >将返回 MATCH
abcdefgbh
- >将返回 NO MATCH (因为字母b
不止一次重复)
答案 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略微修改为另一个问题来解决这个问题。
由于上面提出的问题已经有一段时间了,但我认为在这里也有这个正则表达式模式会很好。