#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 запрашивает извлечение всех пар ключ-значение.