Java / Groovy - строка: заменить символы в сопоставленном регулярном выражении - PullRequest
0 голосов
/ 05 июня 2019

У меня есть проблема с созданием регулярного выражения соответствия, которое будет получено из примера строки: NotificationGroup_n + En, где n - числа от 1 до 4, и когда, скажем, я сопоставляю желаемое число из диапазона, я заменю или удалю его с этим конкретным числом.

Строка ДО процесса: NotificationGroup_4 + E3

Строка ПОСЛЕ процесса: NotificationGroup_E3

Я удалил n (число от 1-4) и оставил _E с номером

Мой вопрос заключается в том, как написать регулярное выражение в функции string.replace, чтобы оно соответствовало номеру, а затем знаку плюса, и оставляло только строку с _En

def String string = "Notification_Group_4+E3";
    println(removeChar(string));
}
public static def removeChar(String string) { 
    if ((string.contains("1+"))||(string.contains("2+")||(string.contains("3+"))||(string.contains("4+")))) {
        def stringReplaced = string.replace('4+', "");
        return stringReplaced;
    }
}
.

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

в заводной:

def result = "Notification_Group_4+E3".replaceFirst(/_\d\+(.*)/, '_$1')
println result

вывод:

~>  groovy solution.groovy
Notification_Group_E3

~> 

Попробуйте онлайн!

Визуализация регулярного выражения выглядит следующим образом:

* +1012 *regex visualization

Regex объяснение:

  1. мы используем шпунтовые строки /.../ для определения регулярного выражения. Это облегчает побег
  2. мы первый матч на подчеркивание _
  3. Затем мы сопоставляем одну цифру (0-9), используя предопределенный класс символов \d , как описано в javadoc для класса java Pattern .
  4. Затем мы сопоставляем один + символ. Мы должны избегать этого с обратной косой чертой \, поскольку + без экранирования в регулярных выражениях означает «один или несколько» (см. жадные квантификаторы в javadocs). Нам не нужен один или несколько, нам нужен только один + символ.
  5. Затем мы создаем группу захвата регулярных выражений, как описано в части логических операторов шаблона регулярных выражений java , используя выражение parens (.*). Мы делаем это так, чтобы не быть заблокированными во входной строке, заканчивающейся E3. Таким образом, входная строка может заканчиваться произвольной строкой, и шаблон все равно будет работать. По сути это означает «захватить группу и включить любой символ (например, . в регулярном выражении) любое количество раз (то есть * в регулярном выражении)», что означает «просто захватить оставшуюся часть строки, какой бы она ни была является".
  6. Наконец, мы заменяем на _$1, то есть просто подчеркивание, за которым следует любая захваченная группа захвата. $1 является «обратной ссылкой» на «первую захваченную группу», как описано, например, в java Matcher javadocs .
0 голосов
/ 05 июня 2019

Простой однострочник:

String res = 'Notification_Group_4+E3'.replaceAll( /_\d+\+/, '_' )
assert 'Notification_Group_E3' == res
0 голосов
/ 05 июня 2019

попробуйте это регулярное выражение (\d.*?\+) здесь демо

в Java:

String string = "Notification_Group_4+E3";
System.out.print(string.replaceAll("\\d.*?\\+", ""));

вывод:

Notification_Group_E3
...