1

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

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

\textbf{test1}test2

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

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

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

远非我所需要的。

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

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

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

4

2 回答 2

2

编辑:可悲的是,这个解决方案不会匹配嵌套模式,如\new{\foo{text}}.

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

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

我认为你必须找到除 TeXStudio 正则表达式之外的另一个工具来做你想做的事。


由于它似乎非常有限,我不知道 TeXStudio 是否支持它,但如果您的文本不包含},您可以使用

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

[^}]意思是“除了一个}”。这种方式不需要惰性量词。

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

如果您的输入确实是一个\new{}相互跟随的列表,您可能想尝试一个版本} *\new{以避免替换其他不需要的},并手动执行几个案例?

于 2014-04-09T13:24:18.627 回答
1

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

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

Example for 2 levels
Example for 4 levels

于 2014-04-09T14:59:52.460 回答