0

私のデータには次のような行が含まれています:

55 511 00,"805, 809, 810, 839, 840",J223,201,338,116,16,200,115,6,P,S,"8,5","25,74",47,242,"55,7"

,"(.*)",正規表現として試してみましたが、あまりにも多くの行をキャプチャします。この式は現在、以下を返します。

,"805, 809, 810, 839, 840",J223,201,338,116,16,200,115,6,P,S,"8,5","25,74",

しかし、私が本当に欲しいのは、引用符で囲まれた最初の文字列だけです。有効な結果は次のとおりです。

  • ,"805, 809, 810, 839, 840",
  • 805, 809, 810, 839, 840

その最初の一致だけをキャプチャするにはどうすればよいですか?

4

5 に答える 5

2

* 貪欲ではなく怠惰にする必要があります。

,"(.*?)",

またはすべての文字に一致しますが、":

,"[^"]*",
于 2012-07-13T14:46:31.640 に答える
1

試してみてください"([^"]+)。グループ 1 が一致します805, 809, 810, 839, 840

于 2012-07-13T14:47:42.483 に答える
0
/"([^"]+)"/

仕事をします!「-s」の間のすべて

于 2012-07-13T14:46:36.493 に答える
0

あなたの正規表現は貪欲です。. *は最後の"

したがって、貪欲でないようにするには、?を追加します。括弧で囲まれた部分の最後に:

,"(.*?)",

次の

于 2012-07-13T14:47:28.697 に答える
0

貪欲でない一致を使用する

これを処理するには多くの方法がありますが、最も単純で最も一般的な方法は、正規表現エンジンがサポートしている場合、貪欲でない一致を使用することです。そうでない場合は、データの構造についてより多くのことを知っている式を作成する必要があります。

いくつかの例

以下は、Perl 互換の正規表現を使用して出力を分割する例です。

$ pcregrep -o '"(.*?)"' /tmp/foo | head -n1
"805, 809, 810, 839, 840"

純粋な Perl を使用する別の例を次に示します。

$ perl -ne 'print "$1\n" if /(".*?")/' /tmp/foo
"805, 809, 810, 839, 840"

POSIX 拡張正規表現を使用する 3 番目の例を次に示しますが、貪欲でない一致はサポートしていません。

$ egrep -o '("[^"]+")' /tmp/foo | head -n1
"805, 809, 810, 839, 840"

入力をフィールドに分割し、一致するフィールドが見つかるまで各フィールドをテストすることも検討してください。多くは、あなたが自由に使える施設に依存します。

于 2012-07-13T15:01:53.053 に答える