Regex Gradle:在构建中使用正则表达式替换多行
我设法使用Gradle替换文件中使用RegEx的字符串,但它只在搜索的字符串位于一行时起作用。我还没有成功地替换过几行的东西。我尝试用(?sm)等替换所有,但失败了。我假设Gradle中的过程逐行工作,因为我的正则表达式在IntelliJ搜索中起作用 build.gradle:Regex Gradle:在构建中使用正则表达式替换多行,regex,gradle,Regex,Gradle,我设法使用Gradle替换文件中使用RegEx的字符串,但它只在搜索的字符串位于一行时起作用。我还没有成功地替换过几行的东西。我尝试用(?sm)等替换所有,但失败了。我假设Gradle中的过程逐行工作,因为我的正则表达式在IntelliJ搜索中起作用 build.gradle: rootSpec.eachFile { if (it.name == 'xxx.xml') { it.replaceAll("(?sm)<bean id="featureX(.*)<
rootSpec.eachFile {
if (it.name == 'xxx.xml') {
it.replaceAll("(?sm)<bean id="featureX(.*)</bean>$", "")
}
}
rootSpec.eachFile{
如果(it.name='xxx.xml'){
it.replaceAll(“(?sm)您发布的代码示例无效。首先,您不能在文件中使用replaceAll,其次,您尝试在带有引号的字符串中使用引号,最后,即使它有效,您也不会对结果做任何处理
此外,regex引擎不是由Gradle提供的,而是普通的javasdk。因此,您可以在Java文档中阅读所有关于它的内容
如果我们只看正则表达式本身,您使用的是正确的标志
s
启用点调用模式,其中
将匹配任何字符,包括行终止符。这是匹配多行所必需的
m
启用多行模式,其中^
和$
表达式匹配每行的开头/结尾(而不仅仅是字符串的开头/结尾)。但是,示例中的$
表达式可能是不必要的,甚至可能是不必要的,具体取决于XML的格式。如果需要$
表达式,还需要m
标志;否则,只需将两者都删除即可
当我尝试使用您的表达式时,它可以很好地匹配多行。但是它还可以匹配第一个
元素和最后一个
元素之间的所有内容,这可能不是您想要的。请尝试将贪婪的*
表达式更改为勉强使用的*?
表达式
如果没有将分组用于任何用途,也可以删除分组()
下面是一个示例(在Groovy中):
您发布的代码示例无效。首先,您不能在文件中使用replaceAll,其次,您试图在带有引号的字符串中使用引号,最后,即使它有效,您也无法对结果进行任何处理
此外,regex引擎不是由Gradle提供的,而是普通的javasdk。因此,您可以在Java文档中阅读所有关于它的内容
如果我们只看正则表达式本身,您使用的是正确的标志
s
启用点调用模式,其中
将匹配任何字符,包括行终止符。这是匹配多行所必需的
m
启用多行模式,其中^
和$
表达式匹配每行的开头/结尾(而不仅仅是字符串的开头/结尾)。但是,示例中的$
表达式可能是不必要的,甚至可能是不必要的,具体取决于XML的格式。如果需要$
表达式,还需要m
标志;否则,只需将两者都删除即可
当我尝试使用您的表达式时,它可以很好地匹配多行。但是它还可以匹配第一个
元素和最后一个
元素之间的所有内容,这可能不是您想要的。请尝试将贪婪的*
表达式更改为勉强使用的*?
表达式
如果没有将分组用于任何用途,也可以删除分组()
下面是一个示例(在Groovy中):
谢谢你的回答。
作为一种解决方法,我现在使用过滤器和ReplaceAll,但不替换
行,但通过类似Gradle的方式注释掉这些行
<!-- DoNotRemove Comment Begin -->
<bean ...
...
</bean>
<!-- DoNotRemove Comment End -->
谢谢你的回答。
作为一种解决方法,我现在使用过滤器和ReplaceAll,但不替换
行,但通过类似Gradle的方式注释掉这些行
<!-- DoNotRemove Comment Begin -->
<bean ...
...
</bean>
<!-- DoNotRemove Comment End -->
您好,谢谢您的回答。当我尝试仅替换一行中的文本时,我想从replaceAll中选择/删除整个文本。另一个信息:我在战争中进行替换{…}因为更改的文件应该只在我的war文件中。我发现了一个类似的问题:但我对答案不太满意。啊,所以rootSpec
是CopySpec
类型,你正在调用。每个文件都会给你一个FileCopyDetails
?如果是这样,我不知道你怎么调用replaceAll
在它上面,因为该方法不存在。如果您使用的是过滤器
方法之一,您可以从中看到,每行都将调用闭包
。因此您必须使用另一种方法。我认为您不能在CopySpec中这样做,但之后您应该可以这样做。嗨,谢谢您的回答。我不想这样做o当我尝试仅替换一行中的文本时,选择/删除replaceAll中的整个文本。另一个信息:我在war中进行替换{…}因为更改的文件应该只在我的war文件中。我发现了一个类似的问题:但我对答案不太满意。啊,所以rootSpec
是CopySpec
类型,你正在调用。每个文件都会给你一个FileCopyDetails
?如果是这样,我不知道你怎么调用replaceAll
,因为该方法不存在。如果您使用的是过滤器
方法之一,您可以从中看到,每行都将调用闭包
。因此您必须使用另一种方法。我认为您不能在CopySpec中执行此操作,但之后您应该可以执行此操作。
def xml = """<root>
<bean id="featureX" class="myClass">
<property name="titleX" value="ServiceX"/>
</bean>
<bean id="featureY" class="myClass">
<property name="titleY" value="ServiceY"/>
</bean>
</root>"""
def featureX = new XmlParser().parseText(xml).'bean'.find {it.@id == "featureX"}
def name = featureX.property[0].@name
def value = featureX.property[0].@value
println "FeatureX [$name : $value]"
FeatureX [titleX : ServiceX]
<!-- DoNotRemove Comment Begin -->
<bean ...
...
</bean>
<!-- DoNotRemove Comment End -->
<!-- DoNotRemove Comment Begin
<bean ...
...
</bean>
DoNotRemove Comment End -->