replaceAll
andを使用して2行のソリューションを見つけました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+
であり、残りのキーワード (存在する場合) は digits であると想定しました(\\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
キーワード:
赤
ID:
124
赤 25 124
キーワード:
赤
25
ID:
124
赤 25、124
キーワード:
赤
ID:
25
124