通过正则表达式将字符串拆分为多个部分
split string to parts by regex
我需要通过正则表达式将字符串拆分成多个部分。
字符串是:AA2 DE3
或 AA2
我需要这个 2
.
String code = "AA2 DE3";
String[] parts = code.split("^(AA(\d)+){1}( )?(\w*)?$");
这里parts
的长度是0。
我试过了
String[] parts = code.split("^((AA){1}(\d)+){1}( )?(\w*)?$");
还有 0.
它看起来像是错误的正则表达式。尽管它在 PHP.
中运行良好
编辑
事实上我需要得到"AA"后面的数字,但后面可能还有额外的单词。
对于 String.split
,正则表达式指定了各部分之间的内容。在你的情况下,你的正则表达式匹配整个字符串,所以没有别的,因此它 returns 没有。
如果你想匹配这个正则表达式,使用:
Pattern pattern = Pattern.compile("^(AA(\d)+){1}( )?(\w*)?$");
Matcher matcher = pattern.matcher(code);
if(!matcher.matches()) {
// the string doesn't match your regex; handle this
} else {
String part1 = matcher.group(1);
String part2 = matcher.group(2);
// repeat the above line similarly for the third and forth groups
// do something with part1/part2/...
}
如果您希望 String#split()
为您处理 Pattern/Matcher,您可以使用:
String[] inputs = { "AA2 DE3", "AA3", "BB45 FG6", "XYZ321" };
try {
for (String input : inputs) {
System.out.println(
input.split(" ")[0].split("(?=\d+$)", 2)[1]
);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Input format is incorrect.");
}
}
输出:
2
3
45
321
如果输入保证以AA
开头,也可以使用
System.out.println(
input.split(" ")[0].split("(?<=^AA)")[1]
);
为此使用 Pattern
和 Matcher
API 确实更好。
这纯粹是出于学术目的,以防您必须仅使用 String#split
。您可以将此基于 lookbehind 的正则表达式用于 split
:
(?<=AA\d{1,999}) *
代码:
String[] toks = "AA2 DE3".split( "(?<=AA\d{1,999}) *" ); // [AA2, DE3]
或
String[] toks = "AA2".split( "(?<=AA\d{1,999}) *" ); // [AA2]
假设您只想提取数字而不关心验证其余部分:
Pattern pattern = Pattern.compile("^AA(\d+)");
Matcher matcher = pattern.matcher(code);
String id = null;
if (matcher.find()) {
id = matcher.group(1);
}
请注意,我将 (\d)+
重写为 (\d+)
以捕获所有数字。当有多个数字时,您的正则表达式仅捕获最后一个数字。
如果您想保留您的验证:
Pattern pattern = Pattern.compile("^AA(\d+) ?\w*$");
我需要通过正则表达式将字符串拆分成多个部分。
字符串是:AA2 DE3
或 AA2
我需要这个 2
.
String code = "AA2 DE3";
String[] parts = code.split("^(AA(\d)+){1}( )?(\w*)?$");
这里parts
的长度是0。
我试过了
String[] parts = code.split("^((AA){1}(\d)+){1}( )?(\w*)?$");
还有 0.
它看起来像是错误的正则表达式。尽管它在 PHP.
中运行良好编辑
事实上我需要得到"AA"后面的数字,但后面可能还有额外的单词。
对于 String.split
,正则表达式指定了各部分之间的内容。在你的情况下,你的正则表达式匹配整个字符串,所以没有别的,因此它 returns 没有。
如果你想匹配这个正则表达式,使用:
Pattern pattern = Pattern.compile("^(AA(\d)+){1}( )?(\w*)?$");
Matcher matcher = pattern.matcher(code);
if(!matcher.matches()) {
// the string doesn't match your regex; handle this
} else {
String part1 = matcher.group(1);
String part2 = matcher.group(2);
// repeat the above line similarly for the third and forth groups
// do something with part1/part2/...
}
如果您希望 String#split()
为您处理 Pattern/Matcher,您可以使用:
String[] inputs = { "AA2 DE3", "AA3", "BB45 FG6", "XYZ321" };
try {
for (String input : inputs) {
System.out.println(
input.split(" ")[0].split("(?=\d+$)", 2)[1]
);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Input format is incorrect.");
}
}
输出:
2
3
45
321
如果输入保证以AA
开头,也可以使用
System.out.println(
input.split(" ")[0].split("(?<=^AA)")[1]
);
为此使用 Pattern
和 Matcher
API 确实更好。
这纯粹是出于学术目的,以防您必须仅使用 String#split
。您可以将此基于 lookbehind 的正则表达式用于 split
:
(?<=AA\d{1,999}) *
代码:
String[] toks = "AA2 DE3".split( "(?<=AA\d{1,999}) *" ); // [AA2, DE3]
或
String[] toks = "AA2".split( "(?<=AA\d{1,999}) *" ); // [AA2]
假设您只想提取数字而不关心验证其余部分:
Pattern pattern = Pattern.compile("^AA(\d+)");
Matcher matcher = pattern.matcher(code);
String id = null;
if (matcher.find()) {
id = matcher.group(1);
}
请注意,我将 (\d)+
重写为 (\d+)
以捕获所有数字。当有多个数字时,您的正则表达式仅捕获最后一个数字。
如果您想保留您的验证:
Pattern pattern = Pattern.compile("^AA(\d+) ?\w*$");