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

#java #regex

#java #регулярное выражение

Вопрос:

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

Существующий шаблон: ([^\s,] )\s*=>([^,] ) обновленный шаблон : ([^\s,] )\s*=>([^(,)] )

Java-код:

 
    public static void main(String[] args) {

        String softParms = "batch_code => 'batchCd',user_id => 'SYSUSER',thread_pool => 'tpName',business_date => FN_DATE_ARG(null,0),rerun_number => 0,max_timeout_mins => 0,raise_error => false,thread_notifications => false";

         //Pattern paramPattern = Pattern.compile("([^\s,] )\s*=>([^,] )");
        Pattern paramPattern = Pattern.compile("([^\s,] )\s*=>([^(,)] )");
        Matcher matcher = paramPattern.matcher(softParms);
        while (matcher.find()) {
            String param = matcher.group(1);
            String value = matcher.group(2);
            System.out.println("Param: "   param   ", Value: "   value);
        }
    }

 

Значение параметра для business_date должно иметь вид, FN_DATE_ARG(null,0) но функция либо возвращает FN_DATE_ARG(null , либо FN_RMB_DATE_ARG

Был бы признателен за любую помощь в этом!

Комментарии:

1. Вы пробовали онлайн- тестер регулярных выражений?

Ответ №1:

Вы можете использовать

 ([^s,] )s*=>s*(.*?)(?=s*,s*w s*=>|$)
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • ([^s,] ) — Группа 1: один или несколько символов, отличных от пробела и запятой
  • s*=>s* => заключено в ноль или более пробелов
  • (.*?) — Группа 2: любые нулевые или более символов, отличных от символов разрыва строки, как можно меньше
  • (?=s*,s*w s*=>|$) — до самой левой последовательности из 0 пробелов, запятой, 0 пробелов, 1 символов word, 0 пробелов => , или конца строки.

В вашем коде используйте

 Pattern paramPattern = Pattern.compile("([^\s,] )\s*=>\s*(.*?)(?=\s*,\s*\w \s*=>|$)");
 

Смотрите демонстрацию Java онлайн.

Ответ №2:

Зачем использовать чрезмерно сложное регулярное выражение, когда все, что нужно, это один однострочный вызов String#replaceAll :

 String softParms = "batch_code => 'batchCd',user_id => 'SYSUSER',thread_pool => 'tpName',business_date => FN_DATE_ARG(null,0),rerun_number => 0,max_timeout_mins => 0,raise_error => false,thread_notifications => false";
String businessDate = softParms.replaceAll(".*\bbusiness_date => (.*?)\s*(?:,[^,\s]  =>.*|$)", "$1");
System.out.println(businessDate);
 

Это выводит:

 FN_DATE_ARG(null,0)
 

Шаблон регулярных выражений будет соответствовать ключу business_date , за которым следует \s*,[^,\s] => , который в этом случае будет соответствовать тексту FN_DATE_ARG(null,0) . Группа (.*?) сопоставления прекратит сопоставление на запятой перед следующим ключом.

Комментарии:

1. Это неправильный ответ, потому что вы извлекаете только одно значение, в то время как OP запрашивает извлечение всех пар ключ-значение.