Java regex для извлечения текста между тегами
У меня есть файл с некоторыми пользовательскими тегами, и я бы хотел написать регулярное выражение для извлечения строки между тегами. Например, если мой тег:
[customtag]String I want to extract[/customtag]
Как написать регулярное выражение для извлечения только строки между тегами. Этот код выглядит как шаг в правильном направлении:
Pattern p = Pattern.compile("[customtag](.+?)[/customtag]"); Matcher m = p.matcher("[customtag]String I want to extract[/customtag]");
Не уверенны что делать дальше. Есть идеи? Благодарю.
- Сильное пароли regex
- Новые строки в sed на Mac OS X
- Редактор с использованием muti-line поиска и замены
- .Net regex: что такое символ character \ w?
- Bash, grep между двумя строками с заданной строкой
- Почему вы не можете использовать кванторы повторения в нулевой ширине за утверждениями
- mod_rewrite: заменить подчеркивания тире
- powershell: как избежать всех символов регулярных выражений из строки
- Перекрытие совпадений в Regex
- Использование sed и grep для поиска и замены
- Как использовать '-prune' вариант 'find' в sh?
- Как заставить Vim выделить символы без ascii?
- Регулярное выражение для удаления тегов HTML
Ты на правильном пути. Теперь вам просто нужно извлечь нужную группу, как показано ниже:
final Pattern pattern = Pattern.compile("(.+?) "); final Matcher matcher = pattern.matcher("String I want to extract "); matcher.find(); System.out.println(matcher.group(1)); // Prints String I want to extract
Если вы хотите извлечь несколько обращений, попробуйте следующее:
public static void main(String[] args) { final String str = "apple helloorange pear "; System.out.println(Arrays.toString(getTagValues(str).toArray())); // Prints [apple, orange, pear] } private static final Pattern TAG_REGEX = Pattern.compile("(.+?) "); private static List getTagValues(final String str) { final List tagValues = new ArrayList (); final Matcher matcher = TAG_REGEX.matcher(str); while (matcher.find()) { tagValues.add(matcher.group(1)); } return tagValues; }
Однако я согласен с тем, что регулярные выражения не являются лучшим ответом здесь. Я бы использовал XPath для поиска элементов, которые меня интересуют. Дополнительную информацию см. В API Java XPath .
Честно говоря, регулярные выражения не являются лучшей идеей для такого типа parsingа. Регулярное выражение, которое вы опубликовали, вероятно, отлично подойдет для простых случаев, но если ситуация станет более сложной, у вас будут огромные проблемы (по той же причине, почему вы не можете корректно анализировать HTML с регулярными выражениями). Я знаю, что вы, вероятно, не хотите это слышать, я знаю, что не делал этого, когда задавал один и тот же вопрос, но синтаксический анализ стал более надежным для меня после того, как я перестала пытаться использовать регулярные выражения для всего.
jTopas – это AWESOME токенизатор, который позволяет легко писать синтаксические анализаторы вручную (я настоятельно рекомендую jtopas над стандартными java-сканерами и т. д.). Если вы хотите увидеть jtopas в действии, вот несколько парсеров, которые я написал с помощью jTopas для синтаксического анализа этого типа файла
Если вы разбираете XML-файлы, вы должны использовать библиотеку синтаксического анализа xml. Не делайте это самостоятельно, если вы просто не делаете это ради удовольствия, там есть проверенные варианты
Общий, более простой и немного примитивный подход для поиска тега, атрибута и значения
Pattern pattern = Pattern.compile("<(\\w+)( +.+)*>((.*))\\1>"); System.out.println(pattern.matcher(" TEST ").find()); System.out.println(pattern.matcher("").find()); System.out.println(pattern.matcher(" TEST ").find()); System.out.println(pattern.matcher(" TEST asd>").find()); System.out.println("-------"); Matcher matcher = pattern.matcher(" TEST "); if (matcher.find()) { for (int i = 0; i < matcher.groupCount(); i++) { System.out.println(i + ":" + matcher.group(i)); } }
final Pattern pattern = Pattern.compile("tag\\](.+?)\\[/tag"); final Matcher matcher = pattern.matcher("[tag]String I want to extract[/tag]"); matcher.find(); System.out.println(matcher.group(1));
Попробуй это:
Pattern p = Pattern.compile(?<=\\<(any_tag)\\>)(\\s*.*\\s*)(?=\\<\\/(any_tag)\\>); Matcher m = p.matcher(anyString);
Например:
String str = " 1Q Ene 3.08% "; Pattern p = Pattern.compile("(?<=\\)(\\s*.*\\s*)(?=\\<\\/TD\\>)"); Matcher m = p.matcher(str); while(m.find()){ Log.e("Regex"," Regex result: " + m.group()) } в String str = " 1Q Ene 3.08% "; Pattern p = Pattern.compile("(?<=\\)(\\s*.*\\s*)(?=\\<\\/TD\\>)"); Matcher m = p.matcher(str); while(m.find()){ Log.e("Regex"," Regex result: " + m.group()) }
Вывод:
10 Эне
3,08%
Я префикс этого ответа: «Вы не должны использовать регулярное выражение для синтаксического анализа XML – это приведет только к тому, что кромки, которые не работают правильно, и регулярное выражение forever-Increase сложны, когда вы пытаетесь его исправить «.
При этом вам нужно продолжить, сопоставляя строку и захватывая желаемую группу:
if (m.matches()) { String result = m.group(1); // do something with result }
String s = "Test Test1 "; String pattern ="\\<(.+)\\>([^\\<\\>]+)\\<\\/\\1\\>"; int count = 0; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(s); while(m.find()) { System.out.println(m.group(2)); count++; }
в String s = "Test Test1 "; String pattern ="\\<(.+)\\>([^\\<\\>]+)\\<\\/\\1\\>"; int count = 0; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(s); while(m.find()) { System.out.println(m.group(2)); count++; }
Java - экранирование метасимволов в Regex Регулярное выражение для последовательных повторяющихся слов Перекрывающиеся совпадения в R regex заменить на callback в c ++ 11? В чем сложность регулярного выражения? Регулярное выражение для комментариев линии линии от C # Regexp распознавание адреса электронной почты трудно? Разница между регулярным выражением и Какое регулярное выражение может соответствовать последовательностям одного и того же символа? Является ли это C ++ 11 regex ошибкой или компилятором? Регулярные выражения в выражении случая Бэша
Interesting Posts
Как представить DateTime в Excel
Bootstrap 3 – Почему class row шире своего контейнера?
Полнотекстовый поиск в Android
jquery click не работает с созданным контентом ajax
Что происходит, когда заканчиваются все IP-адреса?
Как использовать имя classа в качестве параметра в C #
Невозможно написать файл кеша jarlist при создании проекта Android
Самый простой способ сделать сценарий lua ждать / приостановить / спящий / блок на несколько секунд?
Пауза GC Ошибка после обновления Android 4.4.2
Что такое «кеширующий» код?
Несколько графиков на одном рисунке
Где спецификатор формата DateTime ‘Z’?
Visual Studio отлаживает инструмент «быстрого просмотра» и lambda-выражения
Определить метод вне определения classа?
C # Игнорировать ошибки сертификата?
Давайте будем гением компьютера.