Gradle: заменить несколько строк с помощью регулярных выражений в сборке - PullRequest
0 голосов
/ 17 января 2020

Мне удалось использовать Gradle для замены строки в файле, используя RegEx, но это работает только в том случае, если искомая строка находится в одной строке. Мне не удалось заменить то, что выходит за несколько строк. Я попытался заменить все на (? Sm) et c, но не получилось. Я предполагаю, что процесс в Gradle работает построчно, потому что мой RegEx работает в поиске IntelliJ.

build.gradle:

rootSpec.eachFile {
    if (it.name == 'xxx.xml') {  
        it.replaceAll("(?sm)<bean id="featureX(.*)</bean>$", "")
    }
}

файл xml

   <bean id="featureX" class="myClass">
        <property name="title" value="Service"/>
    </bean>

Может кто-нибудь мне помочь? Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Пример кода, который вы опубликовали, недействителен. Во-первых, вы не можете использовать 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]
0 голосов
/ 20 января 2020

спасибо за ваш ответ. В качестве обходного пути я теперь использую фильтр и ReplaceAll, но я не заменяю строки, а закомментирую строки через Gradle, например

<!-- DoNotRemove Comment Begin -->
<bean ...
...
</bean>
<!-- DoNotRemove Comment End -->

до

<!-- DoNotRemove Comment Begin 
<bean ...
...
</bean>
     DoNotRemove Comment End -->

Не лучшее решение, но оно в порядке Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...