我有一个包含数百个文本块(C ++方法调用的一部分)的大文件,类似于下面的Current
块,我希望使用 Xcode的正则表达式替换来更改每个一个类似于下面的Desired
块,捕获值0.89f,A名称,0.1,0.5和2.
请注意,这两个块分别以new Zapp
和//d.p.’s to show
开头和结尾,因此为了节省自己的手动编辑负担,我希望使用正则表达式搜索和替换。
我面临的主要问题是块的multi-line
性质。如果我们暂时忽略它,我已经在以下single-line
块上执行搜索并替换:
电流:
new Zapp (0.89f // defaultParameterValue , "A name" // name , 0.1 // min , 0.5 // max , 2 // d.p.'s to show
所需:
new Zapp (NormalisableRange<float> (0.1, 0.5) ,NormalisableRange<float> (0.1, 0.5).convertTo0to1(0.89f) , "A name" // name , 2 // d.p.'s to show
查找和替换
查找:Zapp\s+\((.*)\s+// defaultParameterValue\s+,\s+"(.*)"\s+\/\/\s+name\s+,\s+(.*)\s+\/\/\s+min\s+,\s+(.*)\s+\/\/\s+max\s+,\s+(.*)\s+\/\/\s+d.p.'s
替换:Zapp (NormalisableRange<float> ($3, $4) ,NormalisableRange<float> ($3, $4).convertTo0to1($1) , "$2" // name , $5 // d.p.’s
此单行解决方案存在以下问题:在捕获1(1个空格),捕获3个(4个空格)和捕获5个(3个空格)后会看到额外的空白区域,否则它将起作用好:
我试图消除捕获1(0.89f)中的空白,捕获3(0.1)并使用[^\s]+
捕获5(2)但它没有帮助,所以如果有人能指出原因为此,我要感激不尽。
我可以,为了它的价值,使用upper
搜索lower
和\s+
,但我无法将它们全部放在一起以达到预期的效果。
我在网上发现了一些旧帖子,暗示Xcode可能无法执行此任务。如果这是真的,那么有人可以建议一种可以完成工作的替代方法吗?
答案 0 :(得分:3)
原因是.*
过于贪婪,并且与\s+
模式可能匹配的空白相匹配,但对于这个贪婪的子模式。
使用懒惰/不情愿的.*?
:
Zapp\s+\((.*?)\s+// defaultParameterValue\s+,\s+"(.*)"\s+\/\/\s+name\s+,\s+(.*?)\s+\/\/\s+min\s+,\s+(.*?)\s+\/\/\s+max\s+,\s+(.*?)\s+\/\/\s+d.p.'s
请参阅regex demo
或者定义用于匹配浮点数/整数[-+\w.]+
的类(有点不精确,但是因为预期的值类型已知,所以会这样做)或双引号文字("([^"\\]*(?:\\.[^"\\]*)*)"
):
Zapp\s+\(([-+\w.]+)\s+// defaultParameterValue\s+,\s+"([^"\\]*(?:\\.[^"\\]*)*)"\s+\/\/\s+name\s+,\s+([-+\w.]+)\s+\/\/\s+min\s+,\s+([-+\w.]+)\s+\/\/\s+max\s+,\s+([-+\d.]+)\s+\/\/\s+d.p.'s
请参阅another demo
答案 1 :(得分:0)
请参阅Wiktor的回答。他给出了两个解决方案,通常可以解决这个问题。
但是,感谢Rich的回答Multi line search and replace tool,我发现AppCode by JetBrains确实会进行多行搜索并替换:
SEARCH:
new Zapp\s+\(([^\s]+)\s+// defaultParameterValue\n\s+"(.*)"\s+\/\/\s+name\s+, ([^\s]+)\s+// min\n,\s+([^\s]+)\s+// max\n,\s+([^\s]+)\s+// d.p.'s to show
REPLACE:
new Zapp (NormalisableRange<float> ($3, $4)\n\t ,NormalisableRange<float> ($3, $4).convertTo0to1($1)\n\t\t\t , "$2" // name\n\t\t\t , $5 // d.p.'s to show