如何在多行文本块

时间:2016-05-07 00:13:50

标签: regex xcode multiline nsregularexpression

我有一个包含数百个文本块(C ++方法调用的一部分)的大文件,类似于下面的Current块,我希望使用 Xcode的正则表达式替换来更改每个一个类似于下面的Desired块,捕获值0.89f,A名称,0.1,0.5和2.

Current Block

Desired Block

请注意,这两个块分别以new Zapp//d.p.’s to show开头和结尾,因此为了节省自己的手动编辑负担,我希望使用正则表达式搜索和替换。

我面临的主要问题是块的multi-line性质。如果我们暂时忽略它,我已经在以下single-line块上执行搜索并替换:

电流:

Current Single-Line

new Zapp (0.89f // defaultParameterValue , "A name" // name , 0.1 // min , 0.5 // max , 2 // d.p.'s to show

所需:

Desired Single-Line

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个空格)后会看到额外的空白区域,否则它将起作用好:

Comparison of Search and Replace output and ideal output

我试图消除捕获1(0.89f)中的空白,捕获3(0.1)并使用[^\s]+捕获5(2)但它没有帮助,所以如果有人能指出原因为此,我要感激不尽。

enter image description here

我可以,为了它的价值,使用upper搜索lower\s+,但我无法将它们全部放在一起以达到预期的效果。

我在网上发现了一些旧帖子,暗示Xcode可能无法执行此任务。如果这是真的,那么有人可以建议一种可以完成工作的替代方法吗?

2 个答案:

答案 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