regexp replace Java - PullRequest
       1

regexp replace Java

0 голосов
/ 17 июня 2020

У меня есть строка: aaa, bbb, ccc, ddd Результат, который мне нужен: aaa aaa_, bbb bbb_, ccc ccc_, ddd ddd_

Я пробовал вот так: "aaa, bbb, ccc, ddd".replaceAll("(.*?)((, )|$)", "$1 $1_,")

Результат с этим шаблоном: aaa aaa_, bbb bbb_, ccc ccc_, ddd ddd_, _,

Я не хочу видеть , _, при возврате и возврате.

Любые предложения, пожалуйста, как я могу это сделать в Java?

Ответы [ 4 ]

3 голосов
/ 17 июня 2020

Попробуйте.

String r = "aaa, bbb, ccc, ddd".replaceAll("\\w+", "$0 $0_");
System.out.println(r);

результат:

aaa aaa_, bbb bbb_, ccc ccc_, ddd ddd_
2 голосов
/ 17 июня 2020

Измените квантификатор, и я думаю, вам подойдет go. * - это ноль или более вхождений.

Всегда ли существует три пары? Может быть, что-то вроде

(.{3,})((, )|$)

или

([a-z]{3,})((, )|$)

было бы лучше.

+ можно использовать вместо {3}, если должно быть просто один или больше. Если их должно быть ровно три, удалите запятую. {} создает диапазон, а с , устанавливает минимальное и максимальное значение.

Вы можете изменить шаблон подстановки на:

$1 $1_$2

, чтобы избавиться от конечных запятую, но вам нужно будет немного обрезать справа, чтобы удалить последнее подчеркивание (в PHP это будет rtrim).

0 голосов
/ 17 июня 2020

tl; dr

Пропустить регулярное выражение. Просто используйте строковые манипуляции в одном операторе.

Arrays
        .stream( "aaa, bbb, ccc, ddd".split( ", " ) )  // Parse the text using COMMA with SPACE as the delimiter. 
        .map( ( String s ) -> s + " " + s + "_" )      // Change `aaa` to `aaa aaa_`. 
        .collect( Collectors.joining( ", " ) );        // Join the modified strings together as a single string.

aaa aaa_, bbb bbb_, ccc ccc_, ddd ddd_


String::split

Нет необходимости в регулярном выражении .

Вы можете достичь sh этой цели, разделив слова, разделенные запятыми, на массив строк, создайте поток из этого массива и присоедините их обратно снова вместе без лишнего терминатора. И вы можете сделать все, кроме однострочного.

Учитывая этот ввод:

String input = "aaa, bbb, ccc, ddd";

… разбить строку на части.

String[] pieces =  input.split( ", " ) ;

Stream

Создайте поток из этих частей.

Stream < String > streamOfPieces = Arrays.stream( pieces ) ;

Возьмите каждый элемент из потока и преобразуйте каждый, добавляя ПРОБЕЛ, ту же строку снова и подчеркивание, которое вы хотите в конце.

Stream < String > streamOfModifiedPieces = streamOfPieces.map( ( String s ) -> s + " " + s + "_" );

Собрать результаты потока

Завершить поток, собирая все эти преобразованные элементы с помощью Collector. Необходимая нам реализация Collector предоставляется путем вызова Collectors.joining. Мы передаем желаемый разделитель этому сборщику. В нашем случае желаемый разделитель - это ЗАПЯТАЯ и ПРОБЕЛ, ,. Сборщик достаточно умен, чтобы включить разделитель между элементами, но опустить его до конца.

String output = streamOfModifiedPieces.collect( Collectors.joining( ", " ) );

output = aaa aaa_, bbb bbb_, ccc ccc_, ddd ddd_

Однострочный

Скомбинируйте все это в обещанный однострочник.

String output = Arrays.stream( "aaa, bbb, ccc, ddd".split( ", " ) ).map( ( String s ) -> s + " " + s + "_" ).collect( Collectors.joining(", ") );

… или…

String output =
        Arrays
                .stream( "aaa, bbb, ccc, ddd".split( ", " ) )
                .map( ( String s ) -> s + " " + s + "_" )
                .collect( Collectors.joining( ", " ) );

aaa aaa_, bbb bbb_, ccc ccc_, ddd ddd_

0 голосов
/ 17 июня 2020

Вы можете попробовать:

(\w+)

Объяснение приведенного выше регулярного выражения:

( - представляет начало группы захвата

\w - представляет совпадение символов слова из [0-9a-zA-Z_]. Если вы не хотите включать _, вы можете указать его вручную; что-то вроде [0-9A-Za-z]+.

+ - представляет квантификатор, сопоставляющий символы слова 1 или более раз.

) - представляет конец группы захвата.

$1 $1_ - Для запасной части вы можете использовать захваченное пространство группы и захваченную группу вместе с _

Вы можете найти демонстрацию вышеуказанного регулярного выражения в здесь.

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
    private static final Pattern pattern = Pattern.compile("(\\w+)");
    public static void main(String[] args) {
        String string = "aaa, bbb, ccc, ddd\n"
     + "some, someone, something, hello";
        
        String subst = "$1 $1_";
        
        Matcher matcher = pattern.matcher(string);
        
        String result = matcher.replaceAll(subst);
        System.out.println(result);
    }
}

Вы можете найти пример выполнения вышеуказанной реализации в здесь.

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