我使用正则表达式搜索来替换以下字符串:
\new{}\new{\textbf{test1}}\new{test2}
与
\textbf{test1}test2
我使用正则表达式替换\ new {(。*)}来查找和\ 1来替换。
但是搜索总是与我原始字符串的整行匹配,而替换reuslt是:
}\new{\textbf{test1}}\new{test2
远非我需要的。
在Java中的regex表达式中,你可以使用?在量词使它成为一个不情愿的量词之后。然后它尝试找到最小的匹配。所以在java中,我的搜索正则表达式将是
\\new\{(.*?)\}
我需要在TeXStudio中使用相应的正则表达式搜索字符串来进行最小的匹配。无论如何,即使TexStudio不支持非贪婪匹配,仍然可以解决这个问题吗?
答案 0 :(得分:2)
编辑:遗憾的是,此解决方案不会与\new{\foo{text}}
等嵌套模式匹配。
据我所知,匹配平衡模式与正则表达式需要递归模式,如果TeXStudio不支持惰性量词,我怀疑它会支持那些。
这不是关于在您的测试用例上翻译\\new\{(.*?)\}
:这将返回\textbf{test1test2
。
我认为您必须找到除TeXStudio正则表达式之外的其他工具来做您想做的事。
由于看起来非常有限,我不知道TeXStudio是否支持它,但如果你的文字不包含}
,你可以使用
\\new\{([^}]*)\}
[^}]
含义"除了}
"之外的任何内容。这种方式不需要懒惰的量词。
如果这不起作用,我猜你可以尝试从另一个角度解决问题并用空字符串替换\new{
和}
...取决于你的输入,你可能会不想破坏你的其余代码。
如果您的输入确实是一个\new{}
列表,那么您可能需要尝试使用} *\new{
版本以避免替换其他不需要的}
,并执行以下操作:手?
答案 1 :(得分:1)
你知道最深的筑巢有多深吗?新的可以嵌套在新的吗?
如果答案为“是”和“否”,则有一个解决方案:在Robin的解决方案中\\new\{([^}]*)\}
将[^}]*
替换为[^{}]*({[^{}]*})?[^{}]*
,这是“任意数量的不是{}
的字符后跟可能是一个左括号,一些非括号和一个结束的字符,然后是零或更多的非括号。这将匹配嵌套最多两个。对于每个额外级别的嵌套,您需要将中间[^{}]*
替换为另一个[^{}]*({[^{}]*})?[^{}]*
,导致像\\new\{[^{}]*({[^{}]*({[^{}]*({[^{}]*})?[^{}]*})?[^{}]*})?[^{}]*\}
这样的乐趣(4级)。