Java: проблема RegEx (использование символа символа «.») - PullRequest
1 голос
/ 26 ноября 2009

У меня есть документ, хранящийся в виде большой строки. В строке у меня есть несколько встроенных тегов XML, и я хочу получить слова между тегами. Документы могут также содержать HTML-теги, поскольку документы часто являются веб-сайтами.

Пример документа:

"

Меня зовут <ЧЕЛОВЕК> Бобби , я живу в США."

Текущий RegEx:

Pattern p = Pattern.compile("<(LOCATION|PERSON|ORGANIZATION)>[\\w[ '\"/\\!%$\\(\\)\\-\\+]]*</(LOCATION|PERSON|ORGANIZATION)>");

Matcher m = p.matcher("I'm <PERSON>Graham Brown</PERSON> I went to the <LOCATION>USA'S</LOCATION>");

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

Результат = <ЛИЦО> Бобби </ ЛИЦО> <МЕСТО> США </ МЕСТО>

Это прекрасно работает с большинством понятий и грамматик, но регулярное выражение должно позволять находить любой шаблон персонажа между тегами. Когда я пытаюсь использовать «.» (любой символ), как показано ниже, возвращает всю строку.

"

Меня зовут <ЧЕЛОВЕК> Бобби , я живу в США."
 Pattern p = Pattern.compile("<(LOCATION|PERSON|ORGANIZATION)>.</(LOCATION|PERSON|ORGANIZATION)>");

Как вернуть какие-либо символы между угловыми открывающими и закрывающими тегами?

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы. Просто и за помощь в получении правильного ответа. Для пояснения я пометил именованные объекты, используя NER. Если вы не знаете, что это такое, ознакомьтесь с некоторыми из статей, на которые я ссылался, внизу.

Все, что меня интересует - это получить текст между тремя открывающими и закрывающими тегами. Других тегов нет, и документы не являются файлами XML, и я не анализирую все теги HTML и не интересуюсь ими. Все, что меня интересует, это парсинг созданных мной тегов XML, поэтому я считаю, что RegEx - самый простой способ сделать это.

Документы, которые будут добавлены позже ...

Ответы [ 2 ]

4 голосов
/ 26 ноября 2009

Поставьте знак вопроса после .*? для нежадных процессов.

Pattern p = Pattern.compile("<(LOCATION|PERSON|ORGANIZATION)>.*?</(LOCATION|PERSON|ORGANIZATION)>");

PS: я просто поправляю ваше регулярное выражение, но это не значит, что это решение. Использование парсеров всегда лучше.

0 голосов
/ 26 ноября 2009

Пожалуйста, используйте XML-парсер для XML-фрагментов . Это правильный инструмент для вашей проблемы.

Edit: И используйте дезинфицирующее средство HTML для предварительной обработки файла HTML. Дополнительно определите строгую XML-схему для XML, чтобы обеспечить структуру XML.

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