7

このサンプル データは Web サービスによって返されます

200,6、「カリフォルニア、アメリカ」

を使用してそれらを分割しsplit(",")、簡単なコードを使用して結果を確認しようとしました。

String loc = "200,6,\"California, USA\"";       
String[] s = loc.split(",");

for(String f : s)
   System.out.println(f);

残念ながらこれが結果です

200
6
"California
 USA"

期待される結果は

200
6
"California, USA"

さまざまな正規表現を試しましたが、うまくいきませんでした。の中で与えられた正規表現をエスケープすることは可能""ですか?

更新 1 : C# コードを追加

更新 2 : C# コードを削除

4

4 に答える 4

3
,(?=(?:[^"]|"[^"]*")*$)

これはあなたが望む正規表現です(分割関数に入れるには、文字列内の引用符をエスケープする必要があります)

説明

引用符で囲まれていないすべての ', を見つける必要があります。つまり、現在一致するコンマが引用符で囲まれているか外側にあるかを確認するには、先読み ( http://www.regular-expressions.info/lookaround.html ) が必要です。

これを行うには、先読みを使用して、基本的に現在一致している「,」の後に偶数個の「"」文字が続くことを確認します (つまり、引用符の外側にあることを意味します)。

したがって (?:[^"]|"[^"]*")*$、最後まで引用符以外の文字がある場合、または間に何かがある引用符のペアがある場合にのみ一致することを意味します

(?=(?:[^"]|"[^"]*")*$)上記の一致を先読みします

,(?=(?:[^"]|"[^"]*")*$)そして最後に、これは上記の先読みですべての「、」に一致します

于 2013-02-04T04:03:53.567 に答える
2

より簡単な解決策は、 OpenCSVなどの既存のライブラリを使用してデータを解析することです。これは、このライブラリを使用して 2 行で実行できます。

CSVParser parser = new CSVParser();
String [] data = parser.parseLine(inputLine);

これは、将来、より複雑な CSV 値 (複数行の値、または要素内にエスケープされた引用符を含む値など) が返される場合に特に重要になります。依存関係を追加したくない場合は、いつでもそのコードを参照として使用できます (正規表現に基づいていませんが)。

于 2013-02-04T04:16:55.400 に答える
0

Java用の優れたレクサー/パーサーライブラリがある場合は、次の疑似レクサーコードのようなレクサーを定義できます。

Delimiter: ,
Item: ([^,"]+) | ("[^,"]+")
Data: Item Delimiter Data | Item 

レクサーが機能する方法は、最上位のトークン定義(この場合はData)から開始し、文字列がなくなるまで、または文字列がすべてなくなるまで、文字列からトークンを形成しようとすることです。したがって、文字列の場合、次のようになります。

  • 200,6の「California、USA」からデータを作成したいと思います。
  • アイテム、区切り文字、データからデータを作成できます。
  • 私が見た-200はアイテムであり、次には区切り文字であるため、それをトークン化して続行できます。
  • 6、「California、USA」からデータを作りたい
  • アイテム、区切り文字、データからデータを作成できます。
  • 私が見た-6はアイテムであり、次には区切り文字であるため、それをトークン化して続行できます。
  • 「アメリカ、カリフォルニア」からデータを作りたい
  • アイテム、区切り文字、データからデータを作成できます。
  • 「California、USA」はアイテムですが、その後に区切り文字が表示されないので、別のことを試してみましょう。
  • アイテムからデータを作成できます。
  • 「California、USA」はアイテムなので、それをトークン化して続行できます。
  • 文字列は空です。私はこれで終わりです。これがあなたのトークンです。

(私は、Pythonレクサー/パーサーであるPLYのガイドからレクサーがどのように機能するかを学びました:http ://www.dabeaz.com/ply/ply.html )

于 2013-02-04T04:04:54.750 に答える
0

こんにちは、この式を試してください。

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String loc = "200,6,\"Paris, France\"";  
        String[] str1 =loc.split(",(?=(?:[^\"]|\"[^\"]*\")*$)");

        for(String tmp : str1 ){
            System.out.println(tmp);
        }

    }

}
于 2013-02-04T05:28:33.713 に答える