我正在尝试从字符串中提取文本和十六进制颜色。
目前符号“">”有一个小问题
这是我当前获得的代码;
package main.cache;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void extract(String string) {
final String STARTS_WITH_COLOR_LITERAL = "^[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}";
final Pattern pattern = Pattern.compile(STARTS_WITH_COLOR_LITERAL);
Object[] objects = Arrays.stream(string.split("<col=")).filter(part -> pattern.matcher(part).find()).toArray();
String name;
String color = null;
for (int i = 0; i < objects.length; i++) {
String[] line = objects[i].toString().split(">");
if (line.length == 1) {
name = line[0];
} else {
color = line[0];
name = line[1];
}
System.out.println("Color " + color + ", name " + name);
}
}
public static void main(String[] args) {
extract("something before<col=ff00ff>mercides> car<col=ffff00>plates");
}
}
例如,当传递此参数时,输出预计为
Color null, name something before
Color ff00ff, name mercides> car
Color ffff00, name plates
我当前得到的输出是
Color null, name something before
Color ff00ff, name mercides
Color ffff00, name plates
最佳答案
如果您正在寻找配对 color/name
(按此顺序)您可以使用:(?><col=(?<color>[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})>)?(?<text>(?><.*?>)?[^<]+)
static void extract(String string) {
Pattern pattern =
Pattern.compile("(?><col=(?<color>[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})>)?(?<name>(?><.*?>)?[^<]+)");
Matcher m = pattern.matcher(string);
while (m.find()) {
String color = m.group("color");
String name = m.group("name");
System.out.printf("Color %s, name %s\n", color, name);
}
}
/*
Color null, name something before
Color ff00ff, name mercides> car
Color ffff00, name plates
<小时/>
正则表达式详细信息,请参阅 Regex101有关详细信息(请参阅右侧的说明)
(?><col=(?<color>[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})>)?
是颜色,以<col
开头并以>
结尾里面有十六进制字符,它是可选的,所以有一个?
最后(?<text>(?><.*?>)?[^<]+)
名称组,可以有另一个应答器,但最后一个字符可以是<
关于java - 文本未正确分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57546116/