4

重複の可能性:
JavaのRegExを使用したCSV入力の解析

各行に次の形式の文字列の入力値がある入力ファイルがあります。

   "  ab  cd  " ,    "  efgh,ijk.",  4,"lmno"

すなわち、

  1. 単語は引用符で囲まれているか、引用符がありません。
  2. 開始語と終了語の前後のスペースはそれぞれ許可されていません。

編集:3。入力をコンマで区切ることができます。(abc,"Hi Mary,Joe",5

Javaで.Split()を使用して、これを出力するための正規表現が必要です。

ab  cd
efgh,ijk.
4
lmno

私はこれを試しました:

[^",]*[\",]

しかし、これは機能しません"efgh,ijk."

正規表現テストのリンクは次のとおりです。http://regexpal.com/ これについてサポートが必要です。助けてください。ありがとうございました

4

4 に答える 4

2

デモ

正規表現パターン:(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*,?)+?

null値の更新:(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*,?|(?<=,)(),?)+? DEMO

動作の例ですが、CSV形式のようなものですが、本当に奇妙なものを書かない限り、すべてに一致します。

Matcher ma = Pattern.compile("(?:\\s*(?:\\\"([^\\\"]*)\\\"|([^,]+))\\s*,?)+?").matcher("   \"  ab  cd  \" ,    \"  efgh,ijk.\",  4,\"lmno\"");
while (ma.find()) {
    if (ma.group(1) == null) {
        System.out.println(ma.group(2));
    } else {
        System.out.println(ma.group(1));
    }
}

編集、ところで、コードを提供してほしい場合は、正規表現オンラインテスターに​​ついて教えないでください。そうする場合は、正規表現の処理方法を知っているためです。その方法がわからない場合は、質問してください。それも。

于 2012-11-06T21:25:43.933 に答える
2

一致するものを見つけてトリミングし、最終的な結果を得るようにすることをお勧めします。

Matcher m = Pattern.compile("\\s*(?:\"[^\"]*\"|(?:^|(?<=,))[^,]*)").matcher(s);
while (m.find()) {
  System.out.println(m.group().replaceAll("^\\s*\"?\\s*(.*?)\\s*\"?\\s*$", "$1"));
}

このデモを参照してください。

于 2012-11-06T22:28:31.827 に答える
1

デモ)で呼び出しsplit()てみてください。(?:^\s*"\s*|\s*"\s*$|\s*"?\s*,\s*"?\s*)

これは、1つの文字列に含まれるコンマにも一致しますが、これはあなたの場合は間違っています。ただし、を使用する場合は、これが唯一の方法ですsplit()。含まれているコンマ(のように\,)をエスケープする方法を導入できます。これは、正規表現に簡単に追加できます。

それ以外の場合は、文字列を区別する他の手段を使用する必要があり、split()役に立ちません。

于 2012-11-06T21:37:19.287 に答える
0

正規表現を使用したくない場合は、正規表現は「正規表現」であることを意味します。「ここに模様があると思います」は正規表現ではありません。それらは優れており、高速であり、正規表現に入力される入力を完全に制御する場合にのみ使用します。

//no development environment up, there may be compilation errors.
private static String[] csv(final String input){
  String[] inputArray = input.split(",");
  for(int i =0;i < inputArray.length;i++){
//org.apache.commons.lang.StringUtils
    String value = StringUtils.removeEnd(inputArray[i],"\"");
    value = StringUtils.removeStart(value,"\"");
    value = StringUtils.trim(value);

    inputArray[i] = value;
  }
  return inputArray;
}
于 2012-11-06T21:38:24.427 に答える