Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Gradle:在构建中使用正则表达式替换多行_Regex_Gradle - Fatal编程技术网

Regex 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(.*)<

我设法使用Gradle替换文件中使用RegEx的字符串,但它只在搜索的字符串位于一行时起作用。我还没有成功地替换过几行的东西。我尝试用(?sm)等替换所有,但失败了。我假设Gradle中的过程逐行工作,因为我的正则表达式在IntelliJ搜索中起作用

build.gradle:

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