即使编辑器不支持非贪婪匹配,如何在正则表达式替换中进行最小匹配

时间:2014-04-09 13:18:16

标签: regex replace non-greedy

我使用正则表达式搜索来替换以下字符串:

\new{}\new{\textbf{test1}}\new{test2}

\textbf{test1}test2

我使用正则表达式替换\ new {(。*)}来查找和\ 1来替换。

但是搜索总是与我原始字符串的整行匹配,而替换reuslt是:

}\new{\textbf{test1}}\new{test2

远非我需要的。

在Java中的regex表达式中,你可以使用?在量词使它成为一个不情愿的量词之后。然后它尝试找到最小的匹配。所以在java中,我的搜索正则表达式将是

\\new\{(.*?)\}

我需要在TeXStudio中使用相应的正则表达式搜索字符串来进行最小的匹配。无论如何,即使TexStudio不支持非贪婪匹配,仍然可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

编辑:遗憾的是,此解决方案不会与\new{\foo{text}}等嵌套模式匹配。

据我所知,匹配平衡模式与正则表达式需要递归模式,如果TeXStudio不支持惰性量词,我怀疑它会支持那些。

这不是关于在您的测试用例上翻译\\new\{(.*?)\}:这将返回\textbf{test1test2

我认为您必须找到除TeXStudio正则表达式之外的其他工具来做您想做的事。


由于看起来非常有限,我不知道TeXStudio是否支持它,但如果你的文字不包含},你可以使用

\\new\{([^}]*)\}

[^}]含义"除了}"之外的任何内容。这种方式不需要懒惰的量词。

如果这不起作用,我猜你可以尝试从另一个角度解决问题并用空字符串替换\new{} ...取决于你的输入,你可能会不想破坏你的其余代码。

如果您的输入确实是一个\new{}列表,那么您可能需要尝试使用} *\new{版本以避免替换其他不需要的},并执行以下操作:手?

答案 1 :(得分:1)

你知道最深的筑巢有多深吗?新的可以嵌套在新的吗?

如果答案为“是”和“否”,则有一个解决方案:在Robin的解决方案中\\new\{([^}]*)\}[^}]*替换为[^{}]*({[^{}]*})?[^{}]*,这是“任意数量的不是{}的字符后跟可能是一个左括号,一些非括号和一个结束的字符,然后是零或更多的非括号。这将匹配嵌套最多两个。对于每个额外级别的嵌套,您需要将中间[^{}]*替换为另一个[^{}]*({[^{}]*})?[^{}]*,导致像\\new\{[^{}]*({[^{}]*({[^{}]*({[^{}]*})?[^{}]*})?[^{}]*})?[^{}]*\}这样的乐趣(4级)。

Example for 2 levels
Example for 4 levels