Проблема с регулярным выражением с использованием JAVA

#java #regex

Вопрос:

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

Я пытаюсь найти этот "< < < < 06 76 > > " шаблон в огромной строке, которую мне нужно просмотреть. Что я знаю, так это то, что между последним "<" и первым ">" могут быть только символы типа чисел и любое количество пробелов между последним ">" и первым "<" . Кроме того, между каждым "<" или ">" может быть от 1 до 5 пробелов. Мне удалось создать часть шаблона для использования в моем поиске, но я не могу двигаться дальше. Вот что мне удалось создать в качестве шаблона поиска.

         String tag_open = "<\s{0,4}<\s{0,4}<\s{0,4}<\s{0,4}";
 

Я застрял, пытаясь включить идею «любых чисел, не более 4 цифр, разделенных пробелами от 1 до 5».

Наконец, я могу «закрыть» шаблон для поиска с помощью

 "\s{0,4}>\s{0,4}>\s{0,4}"
 

Извините за длинное сообщение. Я стараюсь быть как можно более подробным.
Большое спасибо!
С уважением.

Кажется, я забыл кое-что сказать… Я действительно так и сделал… Есть 2 типа «тегов», которые я должен искать… Один из них «< < < < 06 76 > < 06 76 >> «а второй-это» < 06 76 >>< < 39 85 > < 39 85 >> < 39 85 >>> < 39 85 >>>> «. Где количество пробелов между каждым «<» и «>» может составлять от 1 до 4 и такое же количество пробелов между последними «<» и «> Та же идея находится между последним символом числа и первым «>». Наконец, от 1 до 6 пробелов между цифрами.

ОК… Надеюсь, это моя последняя правка. 🙂 Я должен найти положение этих ДВУХ типов тегов, которые покажут мне начало и конец каждого абзаца. Начало абзаца определяется шаблоном: Начало абзаца: Четыре «<<<<«* несколько пробелов 2 случайных цифры несколько пробелов 2 случайных цифры несколько пробелов Два «><«* несколько пробелов 2 случайных цифры несколько пробелов 2 случайных цифры несколько пробелов два «>>»*.

  • между «<» и «>» может быть от 1 до 4 пробелов.

Конец абзаца: Два «<<«* некоторые пробелы 2 случайных цифры некоторые пробелы 2 случайных цифры некоторые пробелы четыре «><«* некоторые пробелы 2 случайных цифры некоторые пробелы 2 случайных цифры некоторые пробелы четыре «>><«* некоторые пробелы 2 случайных цифры некоторые пробелы 2 случайных цифры некоторые пробелы четыре»>>><«*.

  • между «<» и «>» может быть от 1 до 4 пробелов.

Вот пример текстового абзаца:

< < < < 06 76 > > Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sit amet mauris lorem. Etiam aliquam iaculis tellus, ac accumsan velit. Vivamus venenatis diam sit amet elementum sollicitudin. Curabitur nec finibus tellus. Proin vestibulum placerat diam. Sed eget risus volutpat, placerat arcu non, commodo ex. Vivamus et ipsum efficitur, ornare nisi sit amet, venenatis diam. Sed aliquet lacinia nulla eu mattis. Integer dapibus, odio a rhoncus porttitor, tellus ligula imperdiet sem, at semper magna arcu a mauris. Vestibulum accumsan ornare aliquet. Curabitur a mollis ex, a ullamcorper enim. Donec urna nibh, vestibulum ut gravida vel, posuere id elit. Proin ut fringilla turpis. < < 06 76 > > > >

< < < < 12 23 > > Morbi aliquet condimentum tempus. Fusce quis rutrum lacus. Curabitur blandit vestibulum lacinia. Ut ac maximus dolor. Suspendisse potenti. Sed quis turpis felis. Sed magna mauris, mattis non mi id, mollis posuere massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse dictum sapien bibendum dictum ultricies. Suspendisse sed lectus egestas, congue ligula quis, fringilla sapien. Nullam et odio elit. Nullam pellentesque nunc tellus, vitae pharetra lorem congue id. < < 12 23 > > > >

Еще раз извините за длинный пост и множество правок в последнюю минуту.

Ответ №1:

Что-то вроде этого?

 String input = "<  <       <      < 06  76    >         > ";

//For all tags
Pattern pat = Pattern.compile("(<  ) ([0-9]   ) (>  ) ");

//For tag < < < < 06 76 > >
//Pattern pat = Pattern.compile("(<  ){4}([0-9]   ) (>  ) ");

//For tag < < 39 85 > > > >
//Pattern pat = Pattern.compile("(<  ){2}([0-9]   ) (>  ) ");

Matcher mat = pat.matcher(input);

while(mat.find()) {
    System.out.println(mat.group());
}

//Prints:
//<  <       <      < 06  76    >         > 
 

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

1. Кажется, я забыл кое-что сказать… Я действительно так и сделал… Есть 2 типа «тегов», которые я должен искать… Один из них «< < < < 06 76 > < 06 76 >> «а второй-это» < 06 76 >>< < 39 85 > < 39 85 >> < 39 85 >>> < 39 85 >>>> «. Где количество пробелов между каждым «<» и «>» может составлять от 1 до 4 и такое же количество пробелов между последними «<» и «> Та же идея находится между последним символом числа и первым «>». Наконец, от 1 до 6 пробелов между цифрами.

Ответ №2:

Вы могли бы использовать

 <(?:s{1,5}<)*s*(?:d s*) >(?:s{1,5}>)*
 
  • < Совпадение буквально
  • (?:s{1,5}<)* Повторите 0 раз, чтобы совпадали 1-5 символов пробелов, за которыми следуют <
  • s* Сопоставьте необязательные символы пробелов
  • (?:d s*) Сопоставьте 1 раз, соответствующие 1 цифрам и необязательным символам пробелов
  • > Совпадение буквально
  • (?:s{1,5}>) Повторите 0 раз, сопоставляя 1-5 символов пробелов, за которыми следует >

Демонстрация регулярных выражений | Демонстрация Java

Обратите внимание, что s это также может соответствовать новой строке. В Java вы также можете использовать h{1,5} для сопоставления символов с горизонтальными пробелами.

Пример на Java:

 String regex = "<(?:\s{1,5}<)*\s*(?:\d \s*) >(?:\s{1,5}>)*";
String string = "< < < <      06   76           > >n"
  "< < < <                 > >n"
  "< < < <      06   76  >n"
  "< < < <      06   76  n";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(0));
}
 

Выход

 < < < <      06   76           > >
< < < <      06   76  >
 

Редактировать

Шаблон для начала абзаца

 <(?:s{1,4}<){3}(?:s*dd){2}s*>s{1,4}>
 

Демонстрация регулярных выражений

Шаблон для конца абзаца

 <s{1,4}<(?:s*dd){2}s*>(?:s{1,4}>){3}
 

Демонстрация регулярных выражений

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

 <(?:s{1,4}<){3}(?:s*dd){2}s*>s{1,4}>([sS]*?)<s{1,4}<(?:s*dd){2}s*>(?:s{1,4}>){3}
 

Демонстрация регулярных выражений

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

1. Большое спасибо за ваш ответ. Не могли бы вы объяснить это немного подробнее? 🙂

2. @LeeAndrew Я добавил разбивку шаблона.

3. @LeeAndrew Я добавил оба шаблона для начала и конца абзаца в ответ после обновленного вопроса.

4. Так… Я попробовал предложения, и у меня все еще есть некоторые проблемы… Я только что обновил вопрос, приведя примеры абзацев… Еще раз большое спасибо за ваше время и внимание

5. @LeeAndrew В Java вам нужно дважды избежать обратной косой String regex = "<(?:\s{1,4}<){3}(?:\s*\d\d){2}\s*>\s{1,4}>"; черты См. Эту демонстрацию Java для совпадений ideone.com/lLwjDo