我编写正则表达式将UNIMARC参考书目嵌入子字段转换为标准子字段。因此,我需要更改/翻译子字段名称(例如,将$a
更改为$t
)。我使用带有分支重置https://www.rexegg.com/regex-trick-conditional-replacement.html的Pool技巧,通常效果很好。
仅在$1200
之后的下一个$1
子字段之后才发生此更改。我将此条件添加为第一个捕获组。并添加了文本对比选择,直到下一个子字段(以$
开头)为止,以移动光标并为下一个匹配做准备。
代码:https://regex101.com/r/cSBwlU/1
(?sx)(\$1200[\d ]{2})
(?:(?|
\$a(?=.*(\$t))
|\$d(?=.*(\$l))
|\$e(?=.*(\$o))
|\$f(?=.*(\$f))
|\$g(?=.*(\$g))
)([^\$]*))+
输入字符串:
$ 1 2001 $ a Здоровьемладенца $ e энциклопедия $ f пер。 сангл。 И。 Стариковская
预期输出:
$ t Здоровьемладенца $ o энциклопедия $ f пер。 сангл。 И。 Стариковская
没有量词的正则表达式匹配并转换第一个子字段:
$ t Здоровьемладенца $eэнциклопедия$fпер。 сангл。 И。 Стариковская
第一个捕获组匹配字符串的开头。
第一个非捕获组将子字段名称与其内容匹配。我希望添加+
量词将匹配其余子字段,直到$1
。但是当正则表达式以+
结尾时,实际结果只是最后一组。
$ f пер。 сангл。 И。 Стариковская
为什么跳过行首和之前的比赛?