我试图为4个简单的条件做一个正则表达式:
我无法完成最后一项任务。我所做的:
("
+ "?<=[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])"))
如何通过正则表达式实现上述目标?
发布于 2020-03-02 21:25:07
您可以使用捕获组来获取这些匹配,而不是使用查找器,并使数字组成为可选的:
\b([A-Z]*[a-z]+)(\d+)?([A-Z][a-z]+)\b
\b
单词边界以防止单词成为较大单词的一部分(
Capture group 1 [A-Z]*[a-z]+
匹配0+ chars and匹配A
或AD
,1+ chars A-Z匹配obe
、dobe
或adobe
)
紧群(\d+)?
可选捕获组2以匹配1
(
Capture group 3 [A-Z][a-z]+
匹配一个char and和1+ chars and来匹配Software
)
紧群\b
\b
字界或匹配第二个组(\d*)
中的(\d*)
位数。
然后,您可以检查是否存在组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
发布于 2020-03-02 21:26:26
正则表达式([aA][dD][oO][bB][eE])([0-9]?)([a-zA-Z]+)
满足您所描述的所有4个条件。
([aA][dD][oO][bB][eE])
将用大小写字母的任意组合来匹配"Adobe“一词。([0-9]?)
将在两个单词之间匹配一个选项数字。([a-zA-Z]+)
将匹配任何字母序列。
发布于 2020-03-02 21:45:52
您可以使用以下表达式:
([A-Z]*[a-z]+)(\d+)?([A-Z]*[a-z]+)*
一般来说,表达式将试图找到三个组: 1)以小写开头的字符串,1或更多的大写,2)可选的任意大小的字符串数目3)一个或多个以小写、1或更多大写开头的字符串
https://stackoverflow.com/questions/60496777
复制相似问题