regex - 需要Groovy方式进行部分文件替换

标签 regex groovy

我有一个需要修改的文件。我需要修改的部分(不是整个文件)类似于下面显示的属性。问题是,如果需要的话,我只需要替换“值”的一部分,即“ConfigurablePart”。我收到此文件,所以无法控制它的格式。

alpha.beta.gamma.1 = constantPart1ConfigurablePart1
alpha.beta.gamma.2 = constantPart2ConfigurablePart2
alpha.beta.gamma.3 = constantPart3ConfigurablePart3

我以这种方式完成了这项工作,尽管我知道这确实很糟糕!
def updateFile(String pattern, String updatedValue) {
    def myFile = new File(".", "inputs/fileInherited.txt")
    StringBuffer updatedFileText = new StringBuffer()
    def ls = System.getProperty('line.separator')
    myFile.eachLine{ line ->
        def regex = Pattern.compile(/$pattern/)
        def m = (line =~ regex)
        if (m.matches()) {
            def buf = new StringBuffer(line)
            buf.replace(m.start(1), m.end(1), updatedValue)
            line = buf.toString()
        }
        println line
        updatedFileText.append(line).append(ls)
    }
    myFile.write(updatedFileText.toString())
}

需要传入的模式包含在StringBuffer中替换的组。有谁知道该如何在Groovy中真正完成?

编辑-定义期望的输出

包含示例行的文件需要更新,以使每行的“ConfigurablePart”被提供的更新文本替换。对于我的丑陋解决方案,我需要调用该方法3次,一次替换ConfigurablePart1,一次替换ConfigurablePart2,最后一次替换ConfigurablePart3。也可能有更好的方法!!!

* 更新-回答了我真正需要的*

如果其他人遇到了类似的问题,我所要求的常规代码改进将最好地反射(reflect)在已接受的答案中。但是,对于我的问题,这并不能完全解决我的问题。由于只需要替换部分匹配的行,因此我需要使用反向引用和组。我可以做这项工作的唯一方法是定义一个由三部分组成的regEx,例如:
(.*)(matchThisPart)(.*)

完成后,我可以使用:
it.replaceAdd(~/$pattern/, "\$1$replacement\$3")

多亏了这两个回复-每个都对我有很大帮助!

最佳答案

使用闭包作为arg可以使它更加冗长。这是可以做到的:

//abc.txt
abc.item.1 = someDummyItem1
abc.item.2 = someDummyItem2
abc.item.3 = someDummyItem3
alpha.beta.gamma.1 = constantPart1ConfigurablePart1
alpha.beta.gamma.2 = constantPart2ConfigurablePart2
alpha.beta.gamma.3 = constantPart3ConfigurablePart3
abc.item.4 = someDummyItem4
abc.item.5 = someDummyItem5
abc.item.6 = someDummyItem6

Groovy代码:-
//Replace the pattern in file and write to file sequentially.
def replacePatternInFile(file, Closure replaceText) {
    file.write(replaceText(file.text))
}

def file = new File('abc.txt')
def patternToFind = ~/ConfigurablePart/
def patternToReplace = 'NewItem'

//Call the method
replacePatternInFile(file){
    it.replaceAll(patternToFind, patternToReplace)
}

println file.getText()

//Prints:
abc.item.1 = someDummyItem1
abc.item.2 = someDummyItem2
abc.item.3 = someDummyItem3
alpha.beta.gamma.1 = constantPart1NewItem1
alpha.beta.gamma.2 = constantPart2NewItem2
alpha.beta.gamma.3 = constantPart3NewItem3
abc.item.4 = someDummyItem4
abc.item.5 = someDummyItem5
abc.item.6 = someDummyItem6

确认文件abc.txt。我没有像您那样使用updateFile()方法,但是可以很好地进行如下参数设置:
def updateFile(file, patternToFind, patternToReplace){
   replacePatternInFile(file){
      it.replaceAll(patternToFind, patternToReplace)
   }
} 

关于regex - 需要Groovy方式进行部分文件替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16925325/

相关文章:

javascript - 正则表达式 : Allow only use of a few words and only once per word

java - 在java中编写等于字符串匹配的正则表达式

xml - 使用Groovy标记构建器语法对Grails中的嵌套元素进行XML编码

reflection - 如何使用 Groovy 获取没有继承方法的类的所有方法名称?

java 正则表达式提取不起作用?

java - 使用带花括号的 split() 时出错 "{"

python - 正则表达式:匹配所有内容,直到 `:` 或 `(`

groovy - 何时在 Gradle 任务中使用 "<<"

hibernate - Grails交易问题

groovy - findResults 和 groovy 中的 collect 有什么区别?