0

文字列を分割するために適切に正規表現を作成する方法がわかりませんでした。私はこのタイプの文字example = "on[?a, ?b, ?c]"; 列を持っています時々私はこれを持っています、文字列example2 = "not clear[?c]";

最初の例では、次のように分割します。

[on, a, b, c] 

また

String name = "on";
String [] vars = [a,b,c];

2 番目の例では、次のタイプに分けたいと思います: [不明、c] または

String name = "not clear";
String [] vars = [c];

よろしくお願いします。

4

3 に答える 3

3

識別子の文字セットがわかっている場合は、そのセットに含まれていないすべてのテキストを簡単に分割できます。たとえば、識別子が単語文字 ( [a-zA-Z_0-9]) のみで構成されている場合は、次を使用できます。

String[] parts = "on[?a, ?b, ?c]".split("[\\W]+");
String name = parts[0];
String[] vars = Arrays.copyOfRange(parts, 1, parts.length);

識別子に AZ (上と下) しかない場合は、\\W上記を に置き換えることができます^A-Za-z

これは、複雑な正規表現を使用するよりも洗練されているように感じます。

編集:これには、2番目の例が「明確ではない」という問題があることを認識しています。スペースの代わりにアンダースコアなどを使用するオプションがない場合は、次のように、[?(または部分文字列) を分割して「名前」を取得し、残りを別の分割を行うことができます。

String s = "not clear[?a, ?b, ?c]";
String[] parts = s.split("\\[\\?"); //need the '?' so we don't get an extra empty array element in the next split
String name = parts[0];
String[] vars = parts[1].split("[\\W]+");
于 2013-02-11T17:09:09.470 に答える
2

これは近づいていますが、問題は、3番目に記憶されたグループが実際に繰り返されるため、最後の一致のみをキャプチャすることです。

(.*?)\[(?:\s*(?:\?(.*?)(?:\s*,\s*\?(.*?))*)\s*)?]

たとえば、最初にリストon[?a, ?b, ?c]するものは、グループ1をon、2をa3として与えますc。perlを使用している場合は、gフラグを使用して正規表現を行に複数回適用し、次のように使用できます。

my @tokens;
while ( my $line =~ /\s*(.*?)\s*[[,\]]/g ) {
    push( @tokens, $1 );
}

注意してください、私は実際にperlコードをテストしていませんでした。頭のてっぺんからです。それはあなたにアイデアを与えるはずです

于 2013-02-11T17:08:17.253 に答える
1
    String[] parts = example.split("[^\\w ]");
    List<String> x = new ArrayList<String>();
    for (int i = 0; i < parts.length; i++) {
        if (!"".equals(parts[i]) && !" ".equals(parts[i])) {
            x.add(parts[i]);
        }   
    }

これは、スペース以外の文字を区切るスペースが複数ない限り機能します。null 文字列と " " 文字列を除外するには、おそらくもっと賢い方法があります。

于 2013-02-11T17:33:23.660 に答える