Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将大写字母与相应的小写字母匹配?_Java_Regex - Fatal编程技术网

Java 如何将大写字母与相应的小写字母匹配?

Java 如何将大写字母与相应的小写字母匹配?,java,regex,Java,Regex,我有一个要求,那就是一个名字不能以3个相同的字母开头,忽略它们的大小写。名称以大写字母开头,后跟小写字母 基本上,我可以将整个名称转换为大写,然后与正则表达式匹配,如(\p{Lu})\1{3,}.* 但是我想知道是否存在一个符合上述要求的正则表达式,并且不需要对要匹配的字符串进行任何预处理。那么,我可以使用什么正则表达式来匹配字符串,比如Aa、Dd或Uu,而不明确指定任何可能的组合 编辑: 我接受了马科斯的回答。我只需要将其修复为使用长度为1和2的名称,并将其锚定在开始处。因此,我的用例的实际正

我有一个要求,那就是一个名字不能以3个相同的字母开头,忽略它们的大小写。名称以大写字母开头,后跟小写字母

基本上,我可以将整个名称转换为大写,然后与正则表达式匹配,如
(\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==>false
Aal==>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());
现在我们有:

  • 前面一个上置字符的匹配
  • 两个lowcase字符的前向断言
  • 另一个前瞻性声明这两个字符与第一个字符不相同(忽略大小写)
  • 输出:

    Aba: true ABa: false aba: false aBa: false Aaa: false Aab: true 阿巴:是的 阿巴:错 阿巴:错 阿巴:错 Aaa:错
    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这应该满足所有要求(当
    *
    添加到末尾时)(我没有正确阅读问题),我现在不会更改我的解决方案,因为您的解决方案与我现在发现的非常相似。