-1

たくさんの情報が入ったテキストファイルがいくつかあります。それらの文のほとんどは、特定の情報リストで始まります。現在、他の正規表現コード(日付、URL、電子メールなど)で抽出できるアイテムがいくつかあるので、それらを使用しています。しかし、他の情報については、どこから始めればよいかわかりません... .

例えば ​​:

ITEM_LIST_1 = xxxx .
ITEM_LIST_2 = xxxx .
ITEM_LIST_3 = xxxx .
....

特定のアイテムの xxxx (文) を抽出する正規表現を作成しようとしています。

ありがとう

4

1 に答える 1

3
(?<=ITEM_LIST_\d+ = ).*(?= \.)

上記の例と一致する必要がxxxxあります。ただし、任意の長さのルックアラウンドを可能にする正規表現エンジンが必要です。ほとんどはしません (.NET はします)。

別のオプションは

ITEM_LIST_\d+\s*=\s*(.*)\s*\.

一致番号 1 を使用します。これにはルックアラウンドは必要ありませんが、必要以上に一致し、キャプチャ グループを使用して合計一致の部分文字列を選択します。

どちらも問題に合わせて微調整でき、パフォーマンスが向上し、何かが間違っている可能性が低くなりますxxxx

編集:項目がすべて1行にある場合、上記の正規表現は失敗します(貪欲であるため):

PS> [regex]::matches('Item_List_01 = Chapter1 overview, Who''s who, Chapter2 How to. Item_List_02 = Continue of Chapter2, Problems.', 'Item_List_\d+\s*=\s*(.*)\.') | select groups

Groups
------
{Item_List_01 = Chapter1 overview, Who's who, Chapter2 How to. Item_List_02 = Continue of Chapter2, Problems., Chapt...

遅延させることで修正できます:

Item_List_\d+\s*=\s*(.*?)\.

それはうまくいきます:

PS> [regex]::matches('Item_List_01 = Chapter1 overview, Who''s who, Chapter2 How to. Item_List_02 = Continue of Chapter2, Problems.', 'Item_List_\d+\s*=\s*(.*?)\.') | select groups

Groups
------
{Item_List_01 = Chapter1 overview, Who's who, Chapter2 How to., Chapter1 overview, Who's who, Chapter2 How to}
{Item_List_02 = Continue of Chapter2, Problems., Continue of Chapter2, Problems}

ただし、アイテムにピリオドが含まれていると、再び失敗します。

PS> [regex]::matches('Item_List_01 = Foo. Bar. Item_List_02 = Baz, gak.', 'Item_List_\d+\s*=\s*(.*?)\.') | select groups

Groups
------
{Item_List_01 = Foo., Foo}
{Item_List_02 = Baz, gak., Baz, gak}

これは、行末/文字列または別の項目のいずれかが続くことを確認する先読みを (再度) 追加することで解決できます。

Item_List_\d+ = (.*?)\.(?=$| Item_List_\d)

(スペース\s*などについて: ここでは、ソリューション全体でスペースの処理を数回変更するのに少しずさんでした。期待しているデータを把握し、それに応じて正規表現を適応させる必要があります。また、ITEM_LIST/の大文字と小文字を変更しItem_Listましたあなたの質問とコメント. あなたもそれを一貫させる必要があります.)

于 2012-04-04T05:53:06.490 に答える