我正在使用VSCode对XML文件进行全局搜索。在这些文件中有多个这些XML标记的实例:<translated></translated>。我需要找到在这些标记之间的任何一个连字符-的所有出现,其中这些标记的内容可以在多行上。
<translated>
Content is here
Could be on multiple lines
The meeting could take 3-4 hours
</translated>在上面的例子中,短语"3-4小时“中有一个连字符。我需要一个适用于VSCode的正则表达式,它可以查找所有连字符的事件,这些连字符恰好位于这些XML标记的集合中。
发布于 2020-04-05 13:09:47
选项1(使用VS代码)
--一次只能匹配一个破折号,而不是所有的破折号。,这是因为将搜索限制在一组标记中,意味着每次只能进行一次传递。我本来打算删除这个答案,但如果这是唯一的答案,也许总比没有好。所做的工作是必须刷新搜索(在搜索框上方的按钮),并一次又一次地单击“替换”。如果有很多破折号,这将是恼人的,但总比没有答案。
我一直在使用,下面的内容似乎有效。
(<translated>(.|\n)*?)(-)((.|\n)*?<\/translated>)假设您可能希望,例如,替换破折号,它可以添加回组1和4包装在任何新的文本.
$1 <yourTextHere> $4示例:
在替换之前:

替换后(请注意,文件第一节中的3-4仅受影响,3 to 4未更改):

选项2/更新(使用Brackets.io)
虽然我不确定导致VSCode无法跨文件匹配的原因,但下面的regex在多个文件中使用括号(google Brackets.io) .
-(?=[^<]*?<\/translated>) 您必须将所有文件放在一个文件夹中,然后打开该文件夹。然后在项目中搜索(Find > Find in files)。注意,它在屏幕截图中显示了在所有文件中找到的匹配。在所选文件t2 copy.txt的下面板中,它首先匹配在第6行,然后在第16行匹配,并且(正确)不匹配在第10行,因为它不包含在已翻译的标记集中。

发布于 2020-04-12 20:34:26
-(?=[^<]*?<\/translated>)在vscode中不工作的原因是它没有显式地包含换行符\n。尽管[^<]包含换行符,但实际上需要将\n写入regex,以便触发多行选项。为什么会这样呢?
参见https://github.com/microsoft/vscode/issues/75265,它使用类似的正则表达式。这个问题主要是出于性能原因,导致阅读;>}很有趣。
所以简单地使用这个
-(?=[^<]*?\n*<\/translated>)
在vscode工作!
-(?=[^<]*?\n<\/translated>)也适用于您,除非您有单行块,例如:
<translated>Con-tent is he-re</translated>https://stackoverflow.com/questions/61038007
复制相似问题