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]"); 

Не уверенны что делать дальше. Есть идеи? Благодарю.

Ты на правильном пути. Теперь вам просто нужно извлечь нужную группу, как показано ниже:

 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 = "applehelloorangepear"; 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+)( +.+)*>((.*))"); 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(" TESTasd>").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 = "TestTest1"; 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 = "TestTest1"; 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++; } 
  • Как извлечь две последовательные цифры из текстового поля в MySQL?
  • Разделение на запятую вне цитат
  • Разделительная строка с разделителями разделов MySQL в таблицу Temp
  • Можно ли заменить группы в Java regex?
  • Как искать текстовый файл для строк между двумя токенами в терминале Ubuntu и сохранять вывод?
  • Eclipse, поиск и замена регулярных выражений
  • Как напечатать соответствие шаблону регулярного выражения с помощью awk?
  • Notepad ++ Удаляет все, кроме 40 переменных, помещая их в свою линию, комбинируя регулярное выражение
  • Групповой захват в R с несколькими группами захвата
  • Разделительная строка с символом трубы ("|")
  • Есть ли команда linux, например mv, но с регулярным выражением?
  • Давайте будем гением компьютера.