計画:
ウィキペディアのローマ執政官のリストを取得し、データをCSVに入れて、執政官の観点からさまざまな世代の上昇と下降のグラフを作成できるようにします
データソースの例:
509,L. Iunius Brutus,L. Tarquinius Collatinus
suff.,Sp. Lucretius Tricipitinus,P. Valerius Poplicola
suff.,M. Horatius Pulvillus,
508,P. Valerius Poplicola II,T. Lucretius Tricipitinus
507,P. Valerius Poplicola III,M. Horatius Pulvillus II
Vim検索:
/\v(\d+|suff\.),((\w+\.=) (\w+)(\s\w+)=(\s\w+)=(\s[iv]+)=(\s\(.{-}\))=,=){,2}
だから本質的に:
- 最初の年を見つけます(または執政官の指示):
(\d+|suff\.) - 次のグループ化(これを外部グループと呼びましょう)は、最大2回まで見つける必要があります。
(outer group){,2} - これらの2つの外部グループのそれぞれについて、次を見つけます。
- プラエノーメン、オプションのピリオド付き(これが存在しない場合もあります):
(\w+.=) - だれも:
(\w+) - オプションのコグノーメン(以下のすべてのように、スペースを含みます):
(\s\w+)= - オプションのアグノーメン:
(\s\w+)= - オプションの反復(彼が領事を務めたn回目を示します)。データソースには8回を超える反復がありません(したがって、IとVで十分です)。
(\s[iv]+)= - 「シシニウス(サビヌス?)」のようなオプションの説明文:
(\s\(.{-}\))=
- プラエノーメン、オプションのピリオド付き(これが存在しない場合もあります):
(最後のコンマは行の終わりなのでオプションです。)
したがって、バックリファレンスは次のようになります。
\1: year or suffect
\2: the entire second outer group
\3: Praenomen of second outer group (same with all below)
\4: Nomen
\5: Cognomen
\6: Agnomen
\7: Iteration
\8: Explanatory note
問題は、その最初の外側のグループをキャプチャする方法がわからないことです。これは、\2と\3- \ 8の参照が、その2番目の外部グループを見ると上書きされるようなものです。
この置換の使用:
:%s//1:{\1}^I2:{\2}^I3:{\3}^I4:{\4}^I5:{\5}^I6:{\6}^I7:{\7}^I8:{\8}^I9:{\9}
私はこの出力を取得します:
1:{509} 2:{L. Tarquinius Collatinus} 3:{L.} 4:{Tarquinius} 5:{ Collatinus} 6:{} 7:{} 8:{} 9:{}
1:{suff.} 2:{P. Valerius Poplicola} 3:{P.} 4:{Valerius} 5:{ Poplicola} 6:{} 7:{} 8:{} 9:{}
1:{suff.} 2:{M. Horatius Pulvillus,} 3:{M.} 4:{Horatius} 5:{ Pulvillus} 6:{} 7:{} 8:{} 9:{}
1:{508} 2:{T. Lucretius Tricipitinus} 3:{T.} 4:{Lucretius} 5:{ Tricipitinus} 6:{ II} 7:{} 8:{} 9:{}
1:{507} 2:{M. Horatius Pulvillus II} 3:{M.} 4:{Horatius} 5:{ Pulvillus} 6:{ II} 7:{} 8:{} 9:{}
最初の外部グループ内のそれらのグループにアクセスできません。私はそれらが上書きされていると思います:それらは上書きされていますか?もしそうなら、これを回避する方法はありますか?
編集:元のタイトルVim正規表現(または互換性のある正規表現):外部グループが繰り返される場合に(グループ内の)グループを参照する方法は?