Java XML Validator с использованием REGEX и .split () - PullRequest
0 голосов
/ 08 апреля 2011

Привет, ребята. Я создаю валидатор Java XML без использования схемы XML, что, как я заметил, люди делают.Не спрашивайте, почему я им не пользуюсь.

У меня есть текстовая область, я запускаю класс «validator», чтобы просмотреть текст и найти каждый тег XML, например <something> или <something else="test">, добавить егозатем в стек, если он находит соответствующий конечный тег, такой как </something>, ему нужно вытолкнуть его из стека, пока он не обнаружит ошибку несоответствия, и в этом случае мой класс валидатора вернет «Недопустимо в строке X, символ X».

То, что я нигде не могу найти, - это хорошее регулярное выражение, которое будет обрабатывать оба сценария, которые я перечислил выше.Так что я могу запустить свой split ("regex_code") и получить список каждого из моих HTML-тегов и посмотреть, все ли они правильно вложены.

Любая помощь очень ценится!

// РЕДАКТИРОВАТЬ

вот что я искал, мой брат написал это недавно:

String expr = "<\\w.[^/]*?>";
String expr1 = "</\\w.*?>";
String expr2 = "<\\w.*?/>";
Pattern p = Pattern.compile(expr);
Pattern p1 = Pattern.compile(expr1);
Pattern p2 = Pattern.compile(expr2);

спасибо ни за что, ребята, которые сказали мне неиспользуйте регулярное выражение:)

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

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

Например, предположим, что у вас есть следующий (недопустимый) сегмент:

<tag> <!--1-->
  <tag> <!--2-->
  </tag> <!--3-->

регулярное выражение может найти начальный тег 1 и конечный тег 3. Не может ли после этого найти начальный тег 2 и конечный тег 3?

Для правильной проверки я бы рекомендовал сделать следующее:

  1. токенизировать ввод текста в поток токенов.
  2. проанализировать поток токенов для создания абстрактного синтаксического дерева (AST).

Существуют различные инструменты, которые помогут вам в этом.Мой любимый инструмент - ANTLR .

0 голосов
/ 08 апреля 2011

Не используйте регулярные выражения при работе с XML.В самом деле.И когда вы уже используете стек, почему бы не сохранить в нем дополнительную информацию, например номер строки, где вы нашли этот элемент?Таким образом, вашему пользователю будет легко сообщить, что обнаружено несоответствие.

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