Помогите с регулярным выражением. |
Здравствуйте, гость ( Вход | Регистрация )
Помогите с регулярным выражением. |
Razerio |
25.1.2013, 22:55
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 16.1.2013 Пользователь №: 3677 Спасибо сказали: 1 раз(а) Репутация: 0 |
Никак не получается составит работающее регулярное выражение.
Есть примерный текст:
Из текста нужно вытащить все слова начинающиеся со звёздочки(*), кроме тех, что находятся между "<a" и "</a>". То есть в данном случаи должны найтись слова: *must *materials *distribution А остальные должны быть пропущены. Все слова найти довольно просто "[*]+[A-Za-z]+", но вот найти только те, которые вне HTML тегов незнаю как. P.S. Для работы с регулярками использую дефолтный QRegExp (Qt 4.8.4). |
|
|
Litkevich Yuriy |
26.1.2013, 3:45
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
iReset |
26.1.2013, 10:07
Сообщение
#3
|
Участник Группа: Участник Сообщений: 178 Регистрация: 6.6.2012 Пользователь №: 3414 Спасибо сказали: 23 раз(а) Репутация: 2 |
Никак не получается составит работающее регулярное выражение. У меня получилось так:...
Выражение написано с условием того, что тег <a> не имеет вложенности и имеет параметр (например, href), т.е. не "<a>". Выражение "(\\*\\w+\\b)" хорошо было бы доработать с учётом того, что могут быть фразы типа "111*222" или "привет*мир". Но тут нужны более чёткие входные условия. При необходимости могу разъяснить выражение по частям. это кость в горле Регулярных выражений, с помощью них невозможно отслеживать "парные скобки", т.е. элементы играющие их роль Ну невозможно, это все-таки очень жестко сказано. Даже с помощью регулярных выражений Qt можно составить выражение, позволяющее производить поиск на любой, но, правда, заранее известный, уровень вложенности.О вложенности в других языках В Perl возможен просмотр на любой, неизвестный заранее, уровень вложенности с помощью динамических регулярных выражений, "(??{$re})". В .NET это возможно с помощью конструкции-счётчика "(?<DEPTH>)". В PHP можно использовать рекурсивные регулярные выражения "(?R)". |
|
|
Iron Bug |
26.1.2013, 12:32
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
кроме тех, что находятся между "<a" и "</a>". это кость в горле Регулярных выражений, с помощью них невозможно отслеживать "парные скобки", т.е. элементы играющие их рольвозможно, это кость в горле конкретной реализации. я спокойно распарсиваю такие выражения в boost, ANTLR, в обычном перле. в целом, у регекспов такого ограничения нет. это рекурсивные операции. |
|
|
Litkevich Yuriy |
26.1.2013, 16:34
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Razerio |
26.1.2013, 19:36
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 16.1.2013 Пользователь №: 3677 Спасибо сказали: 1 раз(а) Репутация: 0 |
Всем спасибо, забрал пример предложенный iReset'ом. Разъяснения не нужны, выражение не очень сложное.
|
|
|
Iron Bug |
28.1.2013, 7:49
Сообщение
#7
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Я ориентируюсь на тот вариант регулярок, которые поддерживаются множеством ПО. и вот поэтому у меня на работе стоит Msys и я не пользуюсь вендозными шнягами нормальный bash. ну, чуть урезанный, но всяко лучше, чем всё, что есть под вендой. пишу скрипты для обработки файлов только там. |
|
|
call_me_Frank |
18.8.2013, 11:44
Сообщение
#8
|
Студент Группа: Участник Сообщений: 73 Регистрация: 20.10.2010 Пользователь №: 2129 Спасибо сказали: 0 раз(а) Репутация: 0 |
iReset, растолкуй, пожалуйста, вот эту часть выражения:
(?:[^*]*<a\\s(?:.(?!<\\/a>))*.<\\/a>)? где можно почитать про все элементы, допустимые в QRegExp? потому что я еще нигде не встречал описание конструкций, типа ?! и ?:... спасибо |
|
|
Razerio |
18.8.2013, 23:22
Сообщение
#9
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 16.1.2013 Пользователь №: 3677 Спасибо сказали: 1 раз(а) Репутация: 0 |
iReset, растолкуй, пожалуйста, вот эту часть выражения: (?:[^*]*<a\\s(?:.(?!<\\/a>))*.<\\/a>)? Я не iReset, но попытаюсь: (?: ) — пассивная группа, отличается от обычной тем, что при нахождении не записывается в QRegExp.cap(...) [^*] — Любые символы за исключением звёздочки длинной от 0 символов. * — Определяет длину искомых символов, стоящих перед ним, от 0 до бесконечности <a — просто текст "<a" \\s — один пробел . — один любой символ, за исключением переноса строки (?! ) — отрицательное вперёд смотрящее, означает, что после искомого текста не должен находится текст стоящий после ?! <\\/a> — просто текст </a> (прим.: поскольку символ / зарезервированный, то для его использования в качестве обычного текста, его нужно экранировать символами \\) ? — означает, что символ или группа стоящая перед ним может игнорироваться. (прим.: В тексте <p>some text</p>, с помощью регулярного выражения <\\/?p>, можно найти сразу открывающий <p>, и закрывающий тег </p>. Так как в данном случаи символ /, не является обязательным) Описание класса QRegExp, есть на официальном сайте http://qt-project.org/doc/qt-5.0/qtcore/qregexp.html А ещё вот шпаргалка, правда она не совсем по QRegExp, но тоже бывает полезна: |
|
|
Текстовая версия | Сейчас: 25.11.2024, 16:37 |