#java #regex #match
#java #регулярное выражение #сопоставление
Вопрос:
Для сопоставления следующего текста:
текст : SS~B6688~PRELIMINARY PAGESM01~HEADING PAGES
Он имеет такой формат: <code1>~<description1><code2>~<description2><code3>~<description3>....<codeN>~<descriptionN>
Я использовал это регулярное выражение: [A-Z0-9 ] ~[A-Z0-9 ] (?:\[A-Z0-9 ] ~[A-Z0-9 ] )
Итак:
случай 1. SS ~ B66 88 ~ ПРЕДВАРИТЕЛЬНЫЕ СТРАНИЦЫ M01 ~ ЗАГОЛОВОЧНЫЕ СТРАНИЦЫ (Match: OK)
случай 2. SS ~ B66 88 ~ ПРЕДВАРИТЕЛЬНЫЕ СТРАНИЦЫ ~ СТРАНИЦЫ ЗАГОЛОВКОВ (No Match: OK because I removed the code 'M01')
случай 3. SS ~ B66 ~ ПРЕДВАРИТЕЛЬНЫЕ СТРАНИЦЫ M01 ~ СТРАНИЦЫ ЗАГОЛОВКОВ (No Match: OK because I removed the code '88')
Другие примеры:
- SS ~ B66 88 ~ MEKLKE M01 ~ MOIIE
- B ~ A310 0 ~ ПРЕДВАРИТЕЛЬНЫЙ ВВОД 0-00 ~ ЗАГОЛОВОК
Моя проблема в том, что <code>
и <description>
может принимать символы любого типа, поэтому, когда я заменил свое регулярное выражение на:
Мое новое регулярное . ~. (?:\. ~. )
выражение, но оно может соответствовать случаю 2 и случаю 3.
Спасибо за вашу помощь.
Комментарии:
1. Спасибо за ваш ответ. Да, я знаю, что я уже пробовал. ? но он останавливается на первом совпадающем символе
2. Вы заявляете, что данные примера
<code>~<description>
содержат, но это состоит из 3 частейSS~B6688~PRELIMINARY
, это состоит из 2 частейPAGESM01~HEADING
, и в конце есть отдельное слово. Вы можете сделать это довольно конкретным, но это то, что вам нужно? regex101.com/r/P7mjjG/1 Можете ли вы привести пример строки, содержащей все виды символов, которые все равно должны совпадать, по сравнению с теми, которые не должны совпадать?3. Только один блок после каждого разделения на «»: пример
<code>~<description> <code>~<description> <code>~<description>
4. Я отредактировал вопрос
5. Вы можете использовать
^[^~] ~[^\] (?:\[^~] ~[^\] ) $
, см. Демонстрацию регулярных выражений.
Ответ №1:
Вместо использования [A-Z0-9 ]
, который не соответствовал бы всем разрешенным символам или .
который соответствовал бы слишком многим, вы можете использовать отрицаемый символьный класс [^~\]
, соответствующий любому символу, кроме
и ~
, чтобы установить границы для совпадающих частей.
^[^~] ~[^~\] (?:\[^~] ~[^~\] ) $
^
Начало строки[^~] ~
Сопоставьте любой символ, отличный от~
, затем сопоставьте~
[^~\]
Повторите сопоставление 1 раз любого символа, кроме~ and
`(?:
Группа без захвата\[^~] ~[^~\]
Совпадение~
между другими символами, чем~
до и~
)
Закройте группу и повторите 1 или более раз, чтобы соответствовать хотя бы$
Конец строки
Демонстрация регулярных выражений (демонстрация содержит n
, чтобы не пересекать новые строки в данных примера)
Комментарии:
1. Спасибо, это работает с небольшой модификацией:
^[^\~] ~[^~\] (?:\[^\~] ~[^~\] ) $
например, чтобы не совпадать с B ~ A310 0 ~ ПРЕДВАРИТЕЛЬНЫМИ СТРАНИЦАМИ \\ 00-00 ~ СТРАНИЦАМИ ЗАГОЛОВКОВ2. @NourAtfaoui Это, похоже, работает для добавленного варианта использования, исключая обратную косую черту во всех отрицаемых классах символов. regex101.com/r/67gQxi/1