项目:
以维基百科的罗马执政官列表为例,将数据放在 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}
所以本质上:
- 查找开头的年份(或 suffect consul 的指示):
(\d+|suff\.)
- 下一个分组(我们称之为外组)最多需要找到两次:
(outer group){,2}
- 对于这两个外部组中的每一个,找到:
- Praenomen,带有可选句号(有时不存在):
(\w+.=)
- 无人:
(\w+)
- 可选的认知(包括空格,如下所示):
(\s\w+)=
- 可选的 agnome:
(\s\w+)=
- 可选迭代(表示他第 n 次担任领事)。数据源的迭代次数不超过 8 次(所以 I 和 V 就足够了):
(\s[iv]+)=
- 可选的解释性说明,例如“Sicinius (Sabinus?)”:
(\s\(.{-}\))=
- Praenomen,带有可选句号(有时不存在):
(最后一个逗号是可选的,因为它是行尾。)
所以后面的引用结果是:
\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 引用在看到第二个外部组时被覆盖。
使用此替换:
:%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 正则表达式(或任何兼容的正则表达式):如果迭代外部组,如何引用组(组内)?