我正在尝试对4个简单条件进行正则表达式:
AdobeSoftware应该是“ Adobe”和“ Software”->获取2个字符串“ Adobe”和“ 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以匹配A
或AD
,以及1+字符a-z匹配obe
,dobe
或adobe
)
封闭组(\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/