сопоставьте повторяющиеся блоки, разделенные символом ~

#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 `
  • (?: Группа без захвата
    • \[^~] ~[^~\] Совпадение и a ~ между другими символами, чем ~ до и ~ после
  • ) Закройте группу и повторите 1 или более раз, чтобы соответствовать хотя бы
  • $ Конец строки

Демонстрация регулярных выражений (демонстрация содержит n , чтобы не пересекать новые строки в данных примера)

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

1. Спасибо, это работает с небольшой модификацией: ^[^\~] ~[^~\] (?:\[^\~] ~[^~\] ) $ например, чтобы не совпадать с B ~ A310 0 ~ ПРЕДВАРИТЕЛЬНЫМИ СТРАНИЦАМИ \\ 00-00 ~ СТРАНИЦАМИ ЗАГОЛОВКОВ

2. @NourAtfaoui Это, похоже, работает для добавленного варианта использования, исключая обратную косую черту во всех отрицаемых классах символов. regex101.com/r/67gQxi/1