我想检查一个字符串是否具有相同的起始字符和结束字符,以及中间的所有字符是否与起始字符和结束字符不同。示例: "da" 应该通过,因为它以 a ,并且只有非- a 他在中间, "abada" 应该失败,因为它不仅 a 在开头和结尾,也在中间, "bcdefb" 应该通过 — 参见第一个示例。我试着靠自己来做 (.)(?!.*\1)\1 ,但它失败了,因为没有长度限制,字符串的结尾也被取反。
"da"
a
"abada"
"bcdefb"
(.)(?!.*\1)\1
dm7nw8vv1#
你可以用
^(.)(?:(?!\1).)*\1$
查看regex演示。添加 (?s) 如果您的字符串可以包含换行符,则在开始处。细节: ^ -字符串开头 (.) -第1组:任何一个字符 (?:(?!\1).)* -不等于组1中捕获的字符的任何一个字符,零次或多次 \1 -对组1值的反向引用,此处需要与组中相同的字符 $ -字符串结尾。在java中,使用 String#matches() ,您可以省略锚定:
(?s)
^
(.)
(?:(?!\1).)*
\1
$
String#matches()
string.matches("(.)(?:(?!\\1).)*\\1")
1条答案
按热度按时间dm7nw8vv1#
你可以用
查看regex演示。添加
(?s)
如果您的字符串可以包含换行符,则在开始处。细节:^
-字符串开头(.)
-第1组:任何一个字符(?:(?!\1).)*
-不等于组1中捕获的字符的任何一个字符,零次或多次\1
-对组1值的反向引用,此处需要与组中相同的字符$
-字符串结尾。在java中,使用
String#matches()
,您可以省略锚定: