获取自定义匹配括号内的字符串

时间:2017-04-28 21:16:20

标签: regex pattern-matching

在这里已经提到了很多匹配括号内的字符串,但是我没有运气将它们应用到手头的问题:我正在尝试用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}。我知道理论上这可以通过计算括号来完成,但我正试图找到一种更优雅/更干净的方法。

1 个答案:

答案 0 :(得分:1)

使用perl,您可以匹配嵌套结构和平衡数量的括号。使用以下正则表达式:

's/\\red({((?>[^{}]+|(?1))*)})/\2/ig'

它将匹配:

  • \\red - \red子字符串
  • ({((?>[^{}]+|(?1))*)}) - 第1组(技术,我们将需要递归)捕获:
    • { - 开放{
    • ((?>[^{}]+|(?1))*) - 第2组捕获除{}以外的1个字符(带[^{}]+)或整个第1组模式(使用(?1) subroutine call
    • } - 关闭}

匹配将替换为\2反向引用,第2组内容。

您不需要s修饰符,因为模式中没有点。

请参阅an online textregex demo