0

次の文字列を分割する正規表現を探しています

red 12478
blue 25 12375
blue 25, 12364

これは与えるべきです

Keywords red, ID 12478
Keywords blue 25, ID 12475
Keywords blue IDs 25, 12364

各行には、キーワードのセットと ID のセットの 2 つの部分があります。キーワードはスペースで区切り、ID はカンマで区切ります。

次の正規表現を思いつきました:\s*((\S+\s+)+?)([\d\s,]+)

ただし、2番目のものでは失敗します。私は先読みで作業しようとしてきましたが、うまくいきません

文字列を構成要素 (キーワードと ID) に分割しようとしています。

各行の形式は、スペースで区切られた 1 つ以上のキーワードと、それに続く 1 つ以上のカンマで区切られた ID です。ID は数値のみで、キーワードにはコンマは含まれません。

これを行うためにJavaを使用しています。

4

3 に答える 3

2

replaceAllandを使用して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
于 2013-09-18T08:59:37.763 に答える
0

私が思いついた:

(red|blue)( \d+(?!$)(?:, \d+)*)?( \d+)?$

http://rubular.com/r/y52XVeHcxYに示されているように、テストに合格したようです。一致する部分文字列の間にキーワードを挿入するのは簡単なことです。

于 2013-09-17T16:40:24.973 に答える