我不是在编写脚本,只是在查找和替换对话框中使用正则表达式。
我正在尝试编写一个搜索模式,该模式将从 xml 块中提取我想要的文本。我遇到的困难是有时这些块包含一段特定的文本,有时它们不包含。如果那段文字在那里,我想把它拉出来;如果不是,我想拿出我需要的其他文本。
我想出的搜索字符串使用一个带有 * 的组来表示我正在寻找一个或没有出现有时被省略的字符串。但是当我运行搜索时,我似乎没有捕获到 (X)* 组中的任何内容,因为它在我替换时没有出现。
这是我正在搜索的模型:
<keydef locid="111" keys="KEYREF">
<!-- <keyword keyref="NOTE"/> -->
<topicmeta>
<keywords>
<keyword locid="222">KEYWORD</keyword>
</keywords>
</topicmeta>
</keydef>
这是我要替换的内容:
KEYREF -- 注意 -- 关键字
有时,块看起来像这样:
<keydef locid="111" keys="KEYREF">
<topicmeta>
<keywords>
<keyword locid="222">KEYWORD</keyword>
</keywords>
</topicmeta>
</keydef>
在这种情况下,我想用这个代替:
KEYREF -- -- 关键字
这是我一直在尝试的搜索字符串:
(?s)^.+?
这是我的替换模式:
-- --
但是这个搜索永远不会为 返回任何东西,就好像 ()* 没有捕获任何东西,即使那里有东西可以捕获。
我试过测试类似的东西。给定这段文字:
abcde-fghijk-mnopq abcde--mnopq
我可以得到这个搜索模式
(a.+?e)-(f.+?k)*-(m.+?q)
有了这个替换
-- --
生产
abcde -- fghijk -- mnopq abcde -- -- mnopq
当我逐行搜索时。
我只是想不通为什么 * 在多行搜索中不起作用。
看起来你在组中使用星号量词来表示某段文本可能存在也可能不存在。但是,当文本出现时,该组似乎没有捕捉到任何东西。这可能是因为星号量词是贪婪的,这意味着它将匹配尽可能多的字符。要解决此问题,您可以通过在其后添加问号来使星号量词变得惰性。
所以不要使用
()
,尝试使用()?
。
这是更新的搜索模式:
(?s)^.+?<keydef.+?keys="(.+?)"(?s).+?()*?(?s).+?<keyword locid.+?>(.+?)</keyword(?s).+?keydef>
替换模式:
\1 -- \3 -- \4
这应该捕获
()*?
组中的文本,无论它是否存在。
这是聊天的回复chat-gpt
检查使用命令行工具获取此输出(如 XMLStarlet)是否更简单