Как изменить это регулярное выражение для правильного извлечения атрибутов тега - должно быть просто - PullRequest
2 голосов
/ 17 июня 2009

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

Пример XML, с которым мне нужно работать:

<!-- <editable name="nameValue"> --> - content goes here - <!-- </editable> -->

Я хочу иметь возможность получить значение атрибута name, в данном случае это nameValue. То, что у меня есть, показано ниже, но это возвращает нулевое значение.

Моя строка регулярного выражения (для приложения Java, следовательно, \ для экранирования "):
"(.)?<!-- <editable name=(\".*\")?> -->.*<!-- </editable> -->(.)?"

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

Ответы [ 4 ]

2 голосов
/ 17 июня 2009

Я использую JavaScript, но это должно помочь сделать выражение нежадным, где это возможно, и использовать не совпадения вместо любых совпадений символов. Не уверен, насколько похожи регулярные выражения с Java, но вместо выражения \".*\" попробуйте использовать \"[^\"]*\". Это приведет к поиску любого символа в значении атрибута, который не является кавычкой, что означает, что выражение не может совпадать за пределами значения атрибута.

Надеюсь, что поможет

2 голосов
/ 17 июня 2009

Я не думаю, что вам нужны (.)? s в начале и в конце вашего регулярного выражения. И вам нужно поместить в группу захвата для получения только бит «содержимое идет сюда»:

Это сработало для меня:

String xml = "RANDOM STUFF<!-- <editable name=\"nameValue\"> --> - content goes here - <!-- </editable> -->RANDOM STUFF";
Pattern p = Pattern.compile("<!-- <editable name=(\".*\")?> -->(.*)<!-- </editable> -->");
Matcher m = p.matcher(xml);
if (m.find()) {
    System.out.println(m.group(2));
} else {
    System.out.println("no match found");
}

Это печатает:

 - content goes here - 
2 голосов
/ 17 июня 2009

Ваш поиск жадный . Используйте "\<\!-- \<editable name=\"(.*?)\"\> --\>.*?\<\!-- \<\/editable\> --\>" (добавлено ?). Обратите внимание, что этот элемент не будет работать правильно с вложенными элементами <editable>.

Если вы не хотите выполнять проверку синтаксиса, вы также можете просто использовать: "\<\!-- \<editable name=\"(.*?)\"\> --\>" или даже "\<editable name=\"(.*?)\"\>" для лучшей простоты и производительности.

Редактировать: должно быть

Pattern re = Pattern.compile( "\\<editable name=\"(.*?)\"\\>" );
0 голосов
/ 17 июня 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

Вы можете найти ответ , используя TagSoup , полезный.

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