我正在尝试对4个简单条件进行正则表达式:


AdobeSoftware应该是“ Adob​​e”和“ Software”->获取2个字符串“ Adob​​e”和“ Software”
adobeSoftware应该是“ adobe”和“ Software”->获取2个字符串“ adobe”和“ Software”
ADobeSoftware应该是“ ADobe”和“ Software”->获取2个字符串“ ADobe”和“ Software”
adobe1Software应该是“ adobe”,“ 1”和“ Software”->获取3个字符串“ adobe”和“ 1”和“ Software”


我无法实现最后一个。我做了什么 :

("
 + "?<=[a-z])(?=[A-Z])|("
 + "?<=[A-Z])(?=[A-Z][a-z])|("
 + "?<=[0-9])(?=[A-Z][a-z])|("
 + "?<=[a-zA-Z])(?=[0-9])|(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])"))


如何通过正则表达式实现以上目标?

最佳答案

您可以使用捕获组而不是环视来获得这些匹配项,并使数字组成为可选:

\b([A-Z]*[a-z]+)(\d+)?([A-Z][a-z]+)\b



\b单词边界,以防止单词成为较大单词的一部分
(捕获组1


[A-Z]*[a-z]+匹配0+字符A-Z以匹配AAD,以及1+字符a-z匹配obedobeadobe

)封闭组
(\d+)?可选捕获组2以匹配1
(捕获组3


[A-Z][a-z]+匹配一个字符A-Z和1个以上的字符a-z以匹配Software

)封闭组
\b \b字边界


Regex demo | Java demo

或匹配第二组(\d*)中的0+个数字

然后,您可以检查是否存在第2组,或者在后一种情况下,检查第2组的值。

范例程式码

String regex = "\\b([A-Z]*[a-z]+)(\\d+)?([A-Z][a-z]+)\\b";
String string = "AdobeSoftware\n"
     + "adobeSoftware\n"
     + "ADobeSoftware\n"
     + "adobe1Software";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    for (int i = 1; i <= matcher.groupCount(); i++) {
        if (matcher.group(i) != null) {
            System.out.println(matcher.group(i));
        }
    }
    System.out.println("\n");
}


输出量

Adobe
Software

adobe
Software

ADobe
Software

adobe
1
Software

关于java - 尝试使RegEx适用于4个简单条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60496777/

10-13 08:50