(?<=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
ましたあなたの質問とコメント. あなたもそれを一貫させる必要があります.)