Я пытаюсь проанализировать строки данных, используя следующий шаблон: < /p>
1337; группа; переменная; 13.37; key = value; key = value; key = value ... (и т. Д. Номер?; Name ?; name?; Value; (key = value)*.
the; Разделитель может быть установлен на любую строку. Например, если он установлен на foo < /code>, эта строка данных будет считаться действительной: < /p>
1337foogroupfoovariablefoo13.37fookey = value < /p>
< /blockquote>
, только что будет продуманно, это также будет значит, что это будет также значение < /b -код. Действительно: < /p>
foofoofoo13.37 < /p>
< /blockquote>
Я попробовал следующий тестовый код: < /p>
private static final String BASE_PAYLOAD_DATA = "\\s*(\\d*SEPNOTSEP*SEPNOTSEP*SEPNOTSEP+(?:SEPNOTSEP*=NOTSEP*)*)\\s*$";
public static void main(String[] args) {
String line = "1337;GROUP;VARIABLE;13.37;key=value";
String separator = ";";
String processed = StringUtils.replace(BASE_PAYLOAD_DATA, "NOTSEP", "(?!" + separator + ")");
processed = StringUtils.replace(processed, "SEP", "(?:" + separator + ")");
System.out.println(processed);
Pattern payloadData = Pattern.compile(processed);
System.out.println(payloadData.matcher(line).matches());
}
< /code>
Но проверенная строка не совпадает. Строки SEP < /code> и notsep < /code> используются для моделирования того факта, что сепаратор может быть настроен.\s*(\d*(?:;)(?!;)*(?:;)(?!;)*(?:;)(?!;)+(?:(?:;)(?!;)*=(?!;)*)*)\s*$
false
< /code>
Я двойной и тройной проверял шаблон, но я не могу указать на неисправный элемент, и я боюсь, что я мог бы упустить что-то слишком очевидное. шаблон режима Regex? Это не включено в подсчет для нумерации обратных ссылок. Если вы хотите сохранить матч режима в виде Lookahead, вы должны положить схватки скобки вокруг резервуара в Lookahead, например,: (?>
Подробнее здесь: https://stackoverflow.com/questions/256 ... ex-pattern