Groovy: replaceLast () отсутствует - PullRequest
       15

Groovy: replaceLast () отсутствует

0 голосов
/ 18 октября 2019

Мне нужен метод replaceLast () в скрипте Groovy - замените последнюю подстроку. Он доступен на Java, но не на Groovy AFAIK. Он должен работать с регулярным выражением так же, как и следующий replaceFirst.

replaceFirst(CharSequence self, Pattern pattern, CharSequence replacement)
Replaces the first substring of a CharSequence that matches the given compiled regular expression with the given replacement.

РЕДАКТИРОВАТЬ: Извините, что недостаточно конкретен. Исходная строка представляет собой файл XML, и один и тот же ключ (например, Имя) присутствует много раз. Я хочу заменить последний.

<Header>
    <TransactionId>1</TransactionId>
    <SessionId>1</SessionId>
    <User>
       <Name>Bob</Name>
       ...
    </User>
    <Sender>
       <Name>Joe</Name>
       ...
    </Sender>
 </Header>
 ...
 <Context>
    <Name>Rose</Name>
    ...
 </Context>

1 Ответ

2 голосов
/ 18 октября 2019

Понятия не имею, что такое replaceLast в Java ... его нет в JDK ... Если бы он был в JDK, вы могли бы использовать его в Groovy ...

В любом случае, как насчет использованияанализатор XML для изменения XML вместо использования регулярного выражения?

При наличии некоторого xml:

def xml = '''<Header>
    <TransactionId>1</TransactionId>
    <SessionId>1</SessionId>
    <User>
       <Name>Bob</Name>
    </User>
    <Sender>
       <Name>Joe</Name>
    </Sender>
    <Something>
       <Name>Tim</Name>
    </Something>
 </Header>'''

Вы можете проанализировать его с помощью Groovy XmlParser:

import groovy.xml.*

def parsed = new XmlParser().parseText(xml)

Затем вы можете выполнить поиск в глубину для всех узлов с именем Name и взять последний -1 один:

def lastNameNode = parsed.'**'.findAll { it.name() == 'Name' }[-1]

Затем установите значение в новую строку:

lastNameNode.value = 'Yates'

И распечатать новый XML:

println XmlUtil.serialize(parsed)
 <?xml version="1.0" encoding="UTF-8"?><Header>
  <TransactionId>1</TransactionId>
  <SessionId>1</SessionId>
  <User>
    <Name>Bob</Name>
  </User>
  <Sender>
    <Name>Joe</Name>
  </Sender>
  <Something>
    <Name>Yates</Name>
  </Something>
</Header>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...