0

データを含むテキスト ファイルを解析しています。

がテキスト データの場合、データは引用符で囲まれています。例: 「ここに任意のテキスト」

問題は、データ内に引用符を含めることもできますが、常に別の引用符が続くことです。例: " text, he said ""hello"""

私は次のことを試しましたが、成功しませんでした:

  "(.+?)"(?!") 

その形式のテキスト データに一致する REGEX を定義するにはどうすればよいですか?

PS: 役立つかどうかはわかりませんが、各タイプのデータは ; で区切られています。

4

5 に答える 5

1

ここで作成した以前の投稿を参照すると、次のようなものを使用できるはずです。

(?:\"[^\"]*?\")*
于 2012-04-27T16:17:02.280 に答える
1

この正規表現を試してください(テストされていません):

"([^"]|"")*"

編集:(引用符自体を一致させたくないことに気づきませんでした)

(?<=")([^"]|"")*(?=")
于 2012-04-27T15:52:47.310 に答える
0

のように、メッセージの一部ではない文字があることを確認できます~。「」を ~ に置き換えて、一致させ、最後に元~""戻すことができます。

text.replaceAll ("\"\"", "~").
     replaceAll ("(\"[^\"]+)", "($1)").
     replaceAll ("~", "\"\"")

理論的に。

実際には、最初と最後で引用符が一致するので、このテキストは次のようになります。

echo 'asdf " I say ""hello"" " foo " you say ""goodbye"" "baz' 

は次のように翻訳されます。

echo 'asdf (" I say ""hello"" )(" foo )(" you say ""goodbye"" )("baz' )

エラーが見つかりませんが、アイデアは役立つかもしれません。

于 2012-04-27T16:15:43.747 に答える
0

入力が適切な形式である (不均衡な引用符がない) ことを確認できる場合、これは機能します (適切な形式でない場合は、どうしたいですか?):

"(([^"]*?)((""[^"]*?)*?))"(?!")

これは、引用符の後に引用符以外のものが 0 回以上続き、任意の数の二重引用符のペアとそれに続く任意の数の非引用符で構成されるグループが続き、引用符が続かない引用符で終わります。

各データが a で終わることが確実な場合";は、少し簡単になります

"(([^"]*?)((""[^"]*?)*?))";

しかし、行の最後のものは";引用符で終わっていますか?

JoelFan と OldCurmudgeon からインスピレーションを得て、これは機能し、少し単純になりました。

"((?:[^"]|"")*)"

各パターンで、データはキャプチャ グループ 1 にあります。したがって、コードは次のようになります。

while (matcher.find()) {
    data = matcher.group(1);
    /* do whatever you want with the data such as replace '""' with '"' */
}

もちろん、パターンを Java 文字列として記述する場合は、パターン内の引用符をエスケープする必要があるため、コードでは次のようになります。

"\"(([^\"]*?)((\"\"[^\"]*?)*?))\"(?!\")"

また

"\"(([^\"]*?)((\"\"[^\"]*?)*?))\";"

または(コードで使用するもの)

"\"((?:[^\"]|\"\")*)\""
于 2012-04-27T16:31:00.853 に答える
0

これは二重引用符でのみ分割されますが、引用符の外側のデータも提供されます-これが役立つことを願っています

public static void main(String[] args) {
    // TODO code application logic here
    Pattern p = Pattern.compile("[\"]{2}");

    String[] result1 = 
             p.split("\"\"A01 A02\"\" \"\"B01 B02\"\"");
    for (int i=0; i<result1.length; i++)
        System.out.printf("DATA: ]]%s[[\n", result1[i]);
    String[] result3 = 
             p.split("\"\"A21 \" A22\"\" STUFF \"\"B21 B22\"\"");
    for (int i=0; i<result3.length; i++)
        System.out.printf("DATA: ]]%s[[\n", result3[i]);       
}
于 2012-04-27T16:14:47.730 に答える