Java 如何将大写字母与相应的小写字母匹配?
我有一个要求,那就是一个名字不能以3个相同的字母开头,忽略它们的大小写。名称以大写字母开头,后跟小写字母 基本上,我可以将整个名称转换为大写,然后与正则表达式匹配,如Java 如何将大写字母与相应的小写字母匹配?,java,regex,Java,Regex,我有一个要求,那就是一个名字不能以3个相同的字母开头,忽略它们的大小写。名称以大写字母开头,后跟小写字母 基本上,我可以将整个名称转换为大写,然后与正则表达式匹配,如(\p{Lu})\1{3,}.* 但是我想知道是否存在一个符合上述要求的正则表达式,并且不需要对要匹配的字符串进行任何预处理。那么,我可以使用什么正则表达式来匹配字符串,比如Aa、Dd或Uu,而不明确指定任何可能的组合 编辑: 我接受了马科斯的回答。我只需要将其修复为使用长度为1和2的名称,并将其锚定在开始处。因此,我的用例的实际正
(\p{Lu})\1{3,}.*
但是我想知道是否存在一个符合上述要求的正则表达式,并且不需要对要匹配的字符串进行任何预处理。那么,我可以使用什么正则表达式来匹配字符串,比如Aa
、Dd
或Uu
,而不明确指定任何可能的组合
编辑:我接受了马科斯的回答。我只需要将其修复为使用长度为1和2的名称,并将其锚定在开始处。因此,我的用例的实际正则表达式是
^(\p{Lu})(\p{Ll}?$$)(?=\p{Ll}{2})(?i)(?!(\1{2}))
我还对Evgeny和sp00m的答案进行了投票,因为他们帮助我学习了regexes
谢谢你的努力。试试看
String regex = "(?i)(.)(?=\\p{javaLowerCase})(?<=\\p{javaUpperCase})\\1";
System.out.println("dD".matches(regex));
System.out.println("dd".matches(regex));
System.out.println("DD".matches(regex));
System.out.println("Dd".matches(regex));
这与任何大写字母后跟相同字母(大写与否)匹配:
([A-Z])(?i)\1
这与任何大写字母后跟相同字母匹配,但必须小写:
([A-Z])(?!\1)(?i)\1
例如在Java中
String pattern=“([A-Z])(?!\\1)(?i)\\1”;
System.out.println(“AA”.matches(pattern));
System.out.println(“aa”.matches(pattern));
System.out.println(“aA”.matches(pattern));
System.out.println(“Aa”.matches(pattern));
印刷品
false
假的
假的
真的
Evgeniy-Dorofev解决方案正在运行(+1),但只需使用前瞻性,就可以更简单地完成
(\\p{Lu})(?=\\p{Ll})(?i)\\1
(\\p{Lu})
匹配大写字符并将其存储到\\1
(?=\\p{Ll})
是确保下一个字符为小写字母的字符
(?i)
是一个内联修饰符,支持独立于大小写的匹配
\\1
匹配第一部分的大写字母(但由于前面的修饰符,现在不区分大小写)
测试它:
String[] TestInput = { "foobar", "Aal", "TTest" };
Pattern p = Pattern.compile("(\\p{Lu})(?=\\p{Ll})(?i)\\1");
for (String t : TestInput) {
Matcher m = p.matcher(t);
if (m.find()) {
System.out.println(t + " ==> " + true);
} else {
System.out.println(t + " ==> " + false);
}
}
输出:
Aba: true
ABa: false
aba: false
aBa: false
Aaa: false
Aab: true
foobar==>falseAal==>true
t测试==>false 我有一个要求,那就是一个名字不能以3个相同的字母开头,忽略它们的大小写 您应该使用不区分大小写的选项:
(?i)
和“一网打尽”\w
例如:(?i)(\w)\1{2,}.*
或者只是
[a-z]
例如:(?i)([a-z])\1{2,}.*
我承认站在巨人的肩膀上(这里的其他海报),但这个解决方案实际上适用于您的用例:
final String[] strings = { "Aba", "ABa", "aba", "aBa", "Aaa", "Aab" };
final Pattern p = Pattern.compile("(\\p{Lu})(?=\\p{Ll}{2})(?i)(?!(\\1){2})");
for (String s : strings) System.out.println(s + ": " + p.matcher(s).find());
现在我们有:
Aab:true在这里对不同的需求使用单独的检查可能是有意义的,特别是因为需求列表往往会随着时间的推移而增长 您的要求如下所述: 名称不能以3个相同的字母开头,忽略大小写 及 名称以大写字母开头,后跟小写字母
对每一个进行单独的检查(如其他文章中所述)还允许您向用户提供正确的错误消息,描述实际的错误。当然,它更具可读性。
(?i)(\p{Lu})\1{2,}.*
不会,但想指出2,因为一个字母已经匹配。看起来很有希望。也无法匹配字符串,如Dc
。谢谢您的简短介绍。我也试过了,但不匹配AA
。也无法匹配Ab
@SpaceTrucker,所以我并没有真正了解你们的问题。。。它回答“我可以使用什么正则表达式来匹配字符串,如Aa
、Dd
或Uu
,而不明确指定任何可能的组合”。但是您也需要匹配AA
和Ab
?正则表达式不能匹配AA
。就我所测试的而言,你的答案是正确的。这只涉及前两个字符(应该是三个)。而且,即使是前两个字符,它似乎也没有达到要求:它应该为“Ab”提供true,为“Ab”、“Ab”、“Ab”和“Aa”提供false。但是,+1对于好的技术,我认为它是可以修复的。@stema+1现在我知道\\p{Ll}+1这应该满足所有要求(当*
添加到末尾时)(我没有正确阅读问题),我现在不会更改我的解决方案,因为您的解决方案与我现在发现的非常相似。