在这里已经提到了很多匹配括号内的字符串,但是我没有运气将它们应用到手头的问题:我正在尝试用LaTeX文件替换红色文本标签\red{any text}
any text
。但问题是,any text
可能跨越多行,而也包含右括号,例如\red{some \ref{reference} text...}
,结果应为some \ref{reference} text...
perl one-liner
perl -0777 -i.bak -pe 's/\\red{([^}]*)}/\1/igs' /path/to/file.tex
或使用python
from pyparsing import *
sample = "\\red{some \\ref{stuff} text}"
scanner = originalTextFor(nestedExpr('\\red{','}'))
for match in scanner.searchString(sample):
print(match[0])
给出了错误的结果\red{some \ref{stuff}
。我知道理论上这可以通过计算括号来完成,但我正试图找到一种更优雅/更干净的方法。
答案 0 :(得分:1)
使用perl
,您可以匹配嵌套结构和平衡数量的括号。使用以下正则表达式:
's/\\red({((?>[^{}]+|(?1))*)})/\2/ig'
它将匹配:
\\red
- \red
子字符串({((?>[^{}]+|(?1))*)})
- 第1组(技术,我们将需要递归)捕获:
{
- 开放{
((?>[^{}]+|(?1))*)
- 第2组捕获除{
和}
以外的1个字符(带[^{}]+
)或整个第1组模式(使用(?1)
subroutine call)}
- 关闭}
匹配将替换为\2
反向引用,第2组内容。
您不需要s
修饰符,因为模式中没有点。