我有这种字符串:16B66C116B或222A3 * C10B 它是一个数字(带有未知数字),后跟或字母(“A”)或星号和字母(“* A”)。这种模式重复3次。
我想将此字符串拆分为:[数字,文本,数字,文本,数字,文字]
[16, B, 66, C, 116, B]
或
[16, B, 66, *C, 116, B]
我写了这个:
String tmp = "16B66C116B";
String tmp2 = "16B66*C116B";
String pattern = "(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})";
boolean q = tmp.matches(pattern);
String a[] = tmp.split(pattern);
模式匹配正确,但拆分不起作用。
(我愿意改进我的模式字符串,我认为它可以写得更好)。
答案 0 :(得分:2)
您误解了拆分的功能。 Split会在给定正则表达式出现时拆分字符串,因为表达式匹配整个字符串,它返回一个空数组。
你想要的是从匹配中提取单个matching groups
(括号中的东西)。为此,您必须使用Pattern
和Matcher
类。
这里有一个代码片段,可以打印出所有匹配项:
Pattern regex = Pattern.compile("(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})");
Matcher matcher = regex.matcher("16B66C116B");
while (matcher.find()) {
for (int i = 1; i <= matcher.groupCount(); ++i) {
System.out.println(matcher.group(i));
}
}
当然你可以改进正则表达式(就像其他用户建议的那样)
(\\d+)([A-Z]+)(\\d+)(\\*?[A-Z]+)(\\d+)([A-Z]+)
答案 1 :(得分:2)
尝试使用此模式(\\d)+|(\\D)+
并使用Matcher#find()查找与模式匹配的输入序列的下一个子序列。
将所有这些内容添加到List中或最终将其转换为数组。
String tmp = "16B66C116B";
String tmp2 = "16B66*C116B";
String pattern = "((\\d)+|(\\D)+)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(tmp);
while (m.find()) {
System.out.println(m.group());
}