2017-11-14 26 views
0

正規表現で苦労しています。私は**で始まる行の任意の数が続いている*で始まるすべての行にマッチする正規表現がしたい再帰正規表現パターン

* [[February 1]] – ''[[Brave New World]]'', a novel by [[Aldous Huxley]], is first published. 
* [[February 2]] 
** A general [[World Disarmament Conference]] begins in [[Geneva]]. The principal issue at the conference is the demand made by Germany for ''gleichberechtigung'' ("equality of status" i.e. abolishing Part V of the Treaty of Versailles, which had disarmed Germany) and the French demand for ''sécurité'' ("security" i.e. maintaining Part V). 
** The [[League of Nations]] again recommends negotiations between the [[Republic of China (1912–49)|Republic of China]] and Japan. 
** The [[Reconstruction Finance Corporation]] begins operations in Washington, D.C. 
* [[February 4]] 
** The [[1932 Winter Olympics]] open in [[Lake Placid, New York]]. 
** Japan occupies [[Harbin]], China. 
* [[February 9]] – [[Junnosuke Inoue]], prominent Japanese businessman, banker and former governor of the Bank of Japan is assassinated by right-wing extremist group the League of Blood in the [[League of Blood Incident]]. 
* [[February 11]] – [[Pope Pius XI]] meets [[Benito Mussolini]] in [[Vatican City]]. 

:ここで私が働いているテキストです。理想的には、私はグループ内に**という各行を持っています。ここで

は私がしたいのですが、結果である:(。私は目的を短縮するために[...]置かれている)

> Match 1: 
>> Group 1: "* [[February 2]]" 

>> Group 2: "** A general [...] Part V)." 

>> Group 3: "** The [[League of Nations]] [...] and Japan." 

>> Group 4: "** The [[Reconstruction Finance Corporation]] begins operations in Washington, D.C." 

> Match 2: 
>> Group 1: "* [[February 4]]" 

>> Group 2: "** The [[1932 Winter Olympics]] open in [[Lake Placid, New York]]." 

>> Group 3: "** Japan occupies [[Harbin]], China." 

ここで私はこのパターンに来る 次のとおりです。 /(*ANY)^\*{1} (.*)\n(?>(^\*{2}(.*?)\n)+)/gm、ここで私は正規表現をテストするregex101へのリンクです:https://regex101.com/r/ubtnMg/1

ここに私のパターンの説明があります: * (*ANY)どの改行文字がテキストで使用されているかわからないので、改行シーケンスと一致させる必要があります。 * ^\*{1} (.*)\n*で始まる行に一致させるには、改行があるまでその行のテキストをキャプチャします。 * (?>(^\*{2}(.*?)\n)+)は難しい部分です。 **で始まる^\*{1} (.*)\n後のすべての行と一致し、グループ内の行の最後までテキストをキャプチャすることになって、それが*

で始まる新しい行を見つけるまで、それは実際に私は、この与えています:

> Match 1: "* [[February 2]] 
** A general [[World Disarmament Conference]] begins in [[Geneva]]. The principal issue at the conference is the demand made by Germany for ''gleichberechtigung'' ("equality of status" i.e. abolishing Part V of the Treaty of Versailles, which had disarmed Germany) and the French demand for ''sécurité'' ("security" i.e. maintaining Part V). 
** The [[League of Nations]] again recommends negotiations between the [[Republic of China (1912–49)|Republic of China]] and Japan. 
** The [[Reconstruction Finance Corporation]] begins operations in Washington, D.C." 
>> Group 1: "[[February 2]]" 

>> Group 2: "** The [[Reconstruction Finance Corporation]] begins operations in Washington, D.C." 

>> Group 3: "The [[Reconstruction Finance Corporation]] begins operations in Washington, D.C." 

> Match 2: "* [[February 4]] 
** The [[1932 Winter Olympics]] open in [[Lake Placid, New York]]. 
** Japan occupies [[Harbin]], China." 
>> Group 1: "[[February 4]]" 

>> Group 2: "** Japan occupies [[Harbin]], China" 

>> Group 3: " Japan occupies [[Harbin]], China." 

私は十分に明確であり、これで私を助けてくれることを願っています。もっと詳しくお気軽にお尋ねください。 Rawingのコメントに

+0

別々のグループに各行を取り込むことはできません。正規表現はキャプチャグループを動的に生成できません。だからあなたが望むものは不可能です。また、どこでも再帰正規表現は見られません。 –

+0

私はすべてのグループをキャプチャし、すべての行に一致する別の正規表現を行う必要がありますか? – Art2B

+0

これは可能な解決策の1つです。正規表現を使わなくてもやることができます。 –

答えて

0

おかげで、私は、このソリューションに遭遇しました。このようなテキストのすべてのブロックを一致させるために/(*ANY)^\*{1} (.*)\n(^\*{2}(.*?)\n)+/gm

まず、私はこのパターンを使用

* [[February 2]] 
** A general [[World Disarmament Conference]] begins in [[Geneva]]. The principal issue at the conference is the demand made by Germany for ''gleichberechtigung'' ("equality of status" i.e. abolishing Part V of the Treaty of Versailles, which had disarmed Germany) and the French demand for ''sécurité'' ("security" i.e. maintaining Part V). 
** The [[League of Nations]] again recommends negotiations between the [[Republic of China (1912–49)|Republic of China]] and Japan. 
** The [[Reconstruction Finance Corporation]] begins operations in Washington, D.C. 

その後、私は使用してこのパターンは*で始まる行を得る:/^\*{1}(.*)/g。 また、このパターンを使用して、**で始まるすべての行を取得します。/^\*{2}(.*)$/gm