2013-03-13 12 views
3

Я пытаюсь создать регулярное выражение, используя POSIX (расширенные) регулярные выражения, которые я могу использовать в своем программном коде C.POSIX Регулярные выражения: исключая слово в выражении?

В частности, я придумал следующее, однако я хочу исключить слово «http» в согласованных выражениях. При некотором поиске это не похоже на то, что POSIX делает это очевидным для захвата определенных строк. В приведенном ниже примере я использую что-то, называемое «негативным взглядом» (т. Е. (?! Http :)). Однако я боюсь, что это может быть только доступным для регулярных выражений, определенных в диалектах, отличных от POSIX. Разрешено ли отрицательное отображение? Разрешен ли логический оператор NOT в POSIX (т. Е. !)?

Работа пример регулярного выражения:

href|HREF|src[[:space:]]=[[:space:]]\"(?!http:)[^\"]+\"[/]

Если я не могу использовать отрицательный-предпросмотр, как в других диалектах, что я могу сделать, чтобы выше регулярное выражение, чтобы отфильтровать конкретное слово «HTTP:»? В идеале, есть ли какой-либо путь без обратной логики и, в конечном счете, создание смехотворно длинного регулярного выражения в этом процессе? (тот, который у меня выше, довольно длинный, я бы предпочел, чтобы он не выглядел более сбивающим с толку, если это было возможно)

[ПРИМЕЧАНИЕ. Я консультировался с другими связанными потоками в переполнении стека, но наиболее важные из них, похоже, вопрос «в общем», что означает, что полученные ответы не обязательно означали, что они были POSIX-ароматизированными ==> в другом потоке или два, я видел приведенный выше (?!insertWordToExcludeHere) негативный взгляд, но я боюсь, что это только для PHP.)

[ПРИМЕЧАНИЕ 2: Я также буду использовать любые фразировки регулярного выражения POSIX, любая помощь будет оценена по достоинству. Есть ли у кого-нибудь предложение о том, как будет выглядеть регулярное выражение, которое будет отфильтровывать «http:», и как оно может быть вписано в мое текущее регулярное выражение, заменив (?! Http :)?]

ответ

5

до http://www.regular-expressions.info/refflavors.html смотрины и lookbehinds не в аромате POSIX.

Вы можете подумать о терминах лексинга (токенизации) и синтаксического анализа, если ваша проблема слишком сложна, чтобы быть представленным как регулярное выражение.

+0

Ну, приведенное выше регулярное выражение близко к тому, что мне нужно, минус исключение строки «http:». Есть ли у вас какие-либо предложения о том, как я исключаю, что «http» работал в моем регулярном выражении с помощью POSIX? Другими словами, любые предложения о том, как я могу включить выражение в POSIX, которое будет отфильтровывать «http:», но может помещаться в текущее регулярное выражение? – 9codeMan9

+0

Это возможно длинными выражениями, такими как '([^ h"] [^ "] + | h [^ t"] [^ +] + | ht [^ t "] [^ t"] + | ... 'но Я бы не рекомендовал его. Я бы предпочел рекомендацию Паташу в плане лексинга и, в частности, рекомендовать вам искать существующую библиотеку для разбора HTML. Он будет получать другие данные прямо так, что атрибуты могут иметь одинарные кавычки, а также двойные кавычки, то, что выглядит как атрибут, может быть частью основного текста или комментария или раздела CDATA и т. д. –

+0

Хотя я полностью согласен с вами обоими, мне нужно будет просто придумать регулярное выражение для этой длинной формы и вставьте туда, где в настоящее время находится негативный взгляд. Каковы ваши мысли по моему выражению ниже? Это вдохновлено сообщением форума о SO, где кто-то хотел отфильтровать «дерево», но я изменил его, чтобы отфильтровать " http: ^ ([^ h] | (h [^ t]) | (ht [^ t]) | (htt [^ p])) * ($ | (h ($ | (t ($ | р $))))) – 9codeMan9