2017-02-13 20 views
1

正規表現を使用してGEDCOMファイルを解析しようとしていますが、行末にオプションのテキストがある行のテキストの次の行を取得します。各レコードは1行にする必要があります。行末の正規表現

これは、ファイルからの抜粋です:

0 HEAD 
1 CHAR UTF-8 
1 SOUR Ancestry.com Family Trees 
2 VERS (2010.3) 
2 NAME Ancestry.com Family Trees 
2 CORP Ancestry.com 
1 GEDC 
2 VERS 5.5 
2 FORM LINEAGE-LINKED 
0 @[email protected] INDI 
1 BIRT 

、これは私が使用している正規表現です:

(\d+)\s+(@\[email protected])?\s*(\S+)\s+(.*) 

これはで任意のテキストを含まないものを除き、すべての行のために働きます最後のもの、例えば最初のもの。たとえば、最初のレコードの最後の取得グルー​​プには、 '1 CHAR UTF-8'が含まれています。ここで

は紫色のキャプチャグループは、次の行に出血する方法を示し、regex101.comからのスクリーンショットです:

Regex101 screen shot

私は制限するために、$修飾子を使用して試してみました*ちょうどライン終了。これは2行目も行末であるため失敗します。

ご協力いただければ幸いです。

デイブ

+1

'\ s'は改行にマッチし、通常のスペースで置き換えてください。' [^ \ S \ r \ n] '(PCREの場合は' \ h') https://regex101.com/r/N2ZWWo/1を参照してください( '^'は複数行オプションでも追加されています)。 –

+0

Wiktorに感謝します。答えを作成したい場合は、私は最高のものとしてマークします。これはトリックを行うようです:(\ d +)+(@ \ S + @)? *(\ S +)*(。*) –

+0

'。*'はデフォルトでは欲張りであり、可能な限り一致します。 '。*?$'を試して、それを非貪欲なものにしてください。 – phuzi

答えて

1

\sパターンは、改行記号と一致しました。 PCREの場合は[^\S\r\n]または\h、または[\p{Zs}\t]の場合は通常のスペースに交換してください。

(\d+) +(@\[email protected])? *(\S+) +(.*) 

(両側にあなたがラインを一致させる必要がある場合は、複数行のオプションを追加し、(パッテンの終わりの開始と$^)アンカーを追加することができregex demo

を参照してください。 another demo参照)。