заменить Group2 в регулярных выражениях - PullRequest
0 голосов
/ 19 октября 2018

У меня есть текст ниже

    ABCDEF
     JHJHJNJN<098978686
     <jjg>
    HGHJFGV XXXX    
       10-10-2018
    JHKGHKGHG
        JKHJHHJM
10-10-2019 JGHHGHGVH
HBVJHBHBB

Я хочу заменить дату, за которой следует XXX + количество пробелов. Вот мой код

public class Regexreplace {

    public static void main(String[] args){

        String inp = "    ABCDEF"
                     +" JHJHJNJN<098978686"
                     +"     <jjg>         "
                     +" HGHJFGV XXXX     "
                     +"     10-10-2018  "
                     +" JHKGHKGHG  "
                     +"     JKHJHHJM"
                     +"     10-10-2019 JGHHGHGVH"
                     +" HBVJHBHB    ";
        String ipRegex = "(XXXX.*)[\\s]+([\\d]{1,2}-[\\d]{1,2}-[\\d]{4})";

        System.out.println(inp.replaceAll(ipRegex, "$110-11-2018"));

    }

}

Вывод:

ABCDEF  JHJHJNJN<098978686      <jjg>           HGHJFGV XXXX            10-10-2018      JHKGHKGHG       JKHJHHJM    10-11-2018 JGHHGHGVH    HBVJHBHB

Почему в тексте заменяется вторая дата?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Попробуйте с этим выражением reg

"XXXX[\\s]+([\\d]{1,2}-[\\d]{1,2}-[\\d]{4})"
0 голосов
/ 19 октября 2018

((XXXX\s*)(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\d\d$) это будет соответствовать всей дате формата дд-мм-гггг, за которой следует XXXX .....

0 голосов
/ 19 октября 2018

Она заменяет второе свидание, потому что в вашем регулярном выражении есть жадная последовательность «сопоставить что-либо»:

"(XXXX.*)[\\s]+([\\d]{1,2}-[\\d]{1,2}-[\\d]{4})"
//    ^^
//   Here

Ответы на на этот вопрос объясняют разницу между жадным и ненасыщеннымжадные (ленивые) квантификаторы.В двух словах:

Стандартные квантификаторы в регулярных выражениях являются жадными, что означает, что они совпадают настолько, насколько могут, и отдают только по мере необходимости, чтобы соответствовать остатку регулярного выражения.

Для вашего ввода это означает, что последовательность .* будет соответствовать всему, вплоть до строки, содержащей вторую дату.

Поскольку вам не нужно «сопоставлять что-либо», одно решениебыло бы полностью удалить жадную последовательность и поместить последовательность совпадения пробелов в вашу группу захвата:

"(XXXX\\s+)(\\d{1,2}-\\d{1,2}-\\d{4})"

Примечание: нет необходимости ставить \\d или \\s внутри класса символов ([\\s]).

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