replaceAll
我找到了一个使用and的两行解决方案split
:
pattern = "(\\S+(?<!,)\\s+(\\d+\\s+)*)";
String[] keywords = theString.replaceAll(pattern+".*","$1").split(" ");
String[] ids = theString.split(pattern)[1].split(",\\s?");
我假设逗号总是紧跟在每个 ID 的 ID 之后(这可以通过删除与逗号相邻的空格来强制执行),并且没有尾随空格。
我还假设第一个关键字是一系列非空白字符(没有尾随逗号)\\S+(?<!,)\\s+
,其余关键字(如果有)是数字(\\d+\\s+)*
。我根据您的正则表达式尝试做出了这个假设。
这里的正则表达式非常简单,只需(贪婪地)采用任何有效关键字序列,后跟一个空格(或空格)。最长的是关键字列表,其余的是 ID。
完整代码:
public static void main(String[] args){
String pattern = "(\\S+(?<!,)\\s+(\\d+\\s+)*)";
Scanner sc = new Scanner(System.in);
while(true){
String theString = sc.nextLine();
String[] keywords = theString.replaceAll(pattern+".*","$1").split(" ");
String[] ids = theString.split(pattern)[1].split(",\\s?");
System.out.println("Keywords:");
for(String keyword: keywords){
System.out.println("\t"+keyword);
}
System.out.println("IDs:");
for(String id: ids){
System.out.println("\t"+id);
}
System.out.println();
}
}
样品运行:
红124
关键词:
红色的
标识:
124
红色 25 124
关键词:
红色的
25
标识:
124
红色 25, 124
关键词:
红色的
标识:
25
124