Пропустить группировку RegEx - PullRequest
0 голосов
/ 23 октября 2019

Я добавил код с регулярным выражением "" \ (. *? \) ", Чтобы сопоставить слова соответствия, заключенные в (и), и заменить эти значения. Например: test_value_ (obj_id) _ (date_created) будет заменен значениямииз obj_id и date_created. конечная строка будет "test_value_123_10 / 23/19" (значение obj_id равно 123 и date_created 23.10.19)

Но если есть какое-либо выражение, в котором пользователь должен (и) бытьчасть значения вместе с окончательной строкой. Например: test_value _ ((obj_id)) _ (date_created). Шаблон регулярного выражения не работает, и он не распознает группу obj_id. Поэтому окончательное выражение возвращается как "test_value _ ((obj_id)) _ 10/23 /19 "Есть ли способ это исправить?

Ответы [ 2 ]

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

Измените регулярное выражение на

\([^()]*\)

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

Возможно, вы захотите начать с

\([a-zA-Z_]+\)

как шаблон, соответствующий идентификаторам в скобках без цифр.

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

Я думаю, что это может сделать то, что вы хотите:

    String string1 = "test_value_(obj_id)_(date_created)";
    String string2 = "test_value_((obj_id))_(date_created)";

    String objectId = "123";
    String dateCreated = "10/23/19";

    String result1 = string1.replaceAll("(?<!\\()\\(obj_id\\)(?!\\))", objectId)
            .replaceAll("(?<!\\()\\(date_created\\)(?!\\))", dateCreated);

    String result2 = string2.replaceAll("(?<!\\()\\(obj_id\\)(?!\\))", objectId)
            .replaceAll("(?<!\\()\\(date_created\\)(?!\\))", dateCreated);

    System.out.println(string1 + " --> " + result1);
    System.out.println(string2 + " --> " + result2);

    // prints:
    // test_value_(obj_id)_(date_created) --> test_value_123_10/23/19
    // test_value_((obj_id))_(date_created) --> test_value_((obj_id))_10/23/19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...