Как сопоставить Java регулярное выражение между некоторыми "#"? - PullRequest
0 голосов
/ 29 мая 2018

У меня проблема с методом String.replaceFirst.У меня есть следующая строка:

String content = "select * from queries 
                 where update_date >= to_timestamp('#date|Date debut|dd/MM/yyyy# 00:00:00','DD/MM/YYYY HH24:MI:SS') 
                 and update_date <= to_timestamp('#date|Date fin|dd/MM/yyyy# 23:59:59','DD/MM/YYYY HH24:MI:SS')";

(два выражения между '#' определены динамически).И у меня тоже есть 2 даты:

String begin = "28/05/2018";
String end = "29/05/2018";

Тогда я бы заменил первое выражение на начало, а второе на конец.

Я использую:

content = content.replaceFirst("#(date)\\|(.*)\\|(.*)#", begin);
content = content.replaceFirst("#(date)\\|(.*)\\|(.*)#", end);

Несмотря на то, что replaceFirst берет последний '#' всей строки, и я получаю:

select * from queries where update_date >= to_timestamp('28/05/2018 23:59:59','DD/MM/YYYY HH24:MI:SS');

Я понимаю ошибку, но прошу вас помочь мне найти решение.Спасибо большое !Axel.

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Если вы ищете обобщенное регулярное выражение для обеих замен, как этого требует код вашего вопроса, вот как заставить его работать:

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

Вы можете использовать квантификатор lazy ?, чтобы точно указать, что вы хотите захватить как можно меньше символов вместо *. 1009 *

попробуйте:

#(date)\|(.*?)\|(.*?)#

(или экранированная версия для вашего кода: "#(date)\\|(.*?)\\|(.*?)#")

см. Регулярное выражение в regex101

0 голосов
/ 29 мая 2018

Попробуйте это:

    String content = "select * from queries " +
        "where update_date >= to_timestamp('#date|Date debut|dd/MM/yyyy# 00:00:00','DD/MM/YYYY HH24:MI:SS') " +
        "and update_date <= to_timestamp('#date|Date fin|dd/MM/yyyy# 23:59:59','DD/MM/YYYY HH24:MI:SS') ;";

    String begin = "28/05/2018";
    String end = "29/05/2018";

    content = content.replaceFirst( "#date\\|[^\\|]*\\|[^#]*#", begin );
    content = content.replaceFirst( "#date\\|[^\\|]*\\|[^#]*#", end );

    System.out.println( content );

Здесь нам не нужно использовать (), и мы сопоставляемся, пока наш символ не будет похож на |или # соответствует.

0 голосов
/ 29 мая 2018

При чтении вашего вопроса я не был уверен, был ли текст между #s (здесь я имею в виду «дата | Дата дебюта | дд / мм / гггг» и «дата | дата плавник | дд / мм / гггг») динамическиили если вы только что объяснили, что хотите динамически заменить вышеуказанное содержимое исправления вашими динамически определенными датами.

Поэтому я дам вам два ответа (и оба должны работать).

  1. Если текст исправлен:
    #date \ | Дата дебюта \ | дд / мм / гггг # - для первого диапазона
    # дата \ | Дата фин \ | дд / мм / гггг #- для второго диапазона

  2. Если текст между # не является фиксированным:
    # [^ #] * #

Регулярное выражениеВышеуказанное означает найти диапазон символов, начинающихся с #, которые содержат любые символы, кроме #, это то, что [^ #] означает 0 или несколько раз (*) и заканчивается #

Iнадеюсь, это поможет!

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