Пример кода, который вы опубликовали, недействителен. Во-первых, вы не можете использовать replaceAll для файла, во-вторых, вы пытаетесь использовать кавычки внутри строки, заключенной в кавычки, и, наконец, даже если это сработало, вы ничего не делаете с результатом.
Кроме того, механизм регулярных выражений не является чем-то предоставленным Gradle, а представляет собой простой Java SDK. Таким образом, вы можете прочитать все об этом в документации Java.
Если мы просто рассмотрим само регулярное выражение, вы используете правильные флаги.
s
включает режим DOTALL, где .
будет соответствовать любому символу, включая терминаторы строки. Это необходимо для сопоставления нескольких строк.
m
включает многострочный режим, где выражения ^
и $
соответствуют началу / концу каждой строки (а не только началу / концу строки). Однако выражение $
в вашем примере, вероятно, не нужно и, возможно, даже нежелательно, в зависимости от того, как отформатирован XML. Если вам нужно выражение $
, вам также нужен флаг m
; в противном случае просто удалите их обоих.
Когда я попробовал ваше выражение, оно точно соответствует нескольким строкам. Но он также соответствует всему между первым <bean>
и самым последним </bean>
элементом, что, вероятно, не то, что вы хотите. Попробуйте изменить выражение жадного .*
на выражение неохотного .*?
.
Вы также можете удалить группу ()
, если вы ее не используете ни для чего.
Вот пример (в Groovy):
def matches = """<root>
<bean id="featureX" class="myClass">
<property name="title" value="Service"/>
</bean>
<bean id="featureY" class="myClass">
<property name="title" value="Service"/>
</bean>
</root>""" =~ '(?s)<bean id="featureX.*?</bean>'
if (matches.find()) {
println matches.group()
}
Выходы:
<bean id="featureX" class="myClass">
<property name="title" value="Service"/>
</bean>
Если это не работает в вашем скрипте Gradle, вы, вероятно, не работаете с контентом, который считаете нужным находятся. Попробуйте распечатать и проверить правильность регулярного выражения, используя что-то вроде https://regex101.com/ или https://groovyconsole.appspot.com/.
В качестве альтернативы, вы также можете использовать Groovy XmlParser для анализа XML. Это доступно в Gradle, если вы используете Groovy DSL (а не Kotlin DSL или pure Java). Пример:
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]