синтаксическая ошибка в регулярном выражении для соответствия URL ссылки - PullRequest
0 голосов
/ 28 февраля 2009

У меня есть следующий метод в некотором nemerle-коде:

private static getLinks(text : string) : array[string] {
        def linkrx = Regex(@"<a\shref=['|\"](.*?)['|\"].*?>");
        def m = linkrx.Matches(text);
        mutable txmatches : array[string];
        for (mutable i = 0; i < m.Count; ++i) {
            txmatches[i] = m[i].Value;
        }
        txmatches
    }

проблема в том, что компилятор по какой-то причине пытается разобрать скобки внутри оператора regex, и это приводит к тому, что программа не компилируется. Если я удаляю символ @ (который мне сказали поместить туда), я получаю ошибку недопустимого escape-символа на "\ s"

Вот вывод компилятора:

NCrawler.n:23:21:23:22: ←[01;31merror←[0m: when parsing this `(' brace group
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'
NCrawler.n:22:57:22:58: ←[01;31merror←[0m: when parsing this `{' brace group
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'
NCrawler.n:8:1:8:2: ←[01;31merror←[0m: when parsing this `{' brace group
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'
NCrawler.n:23:38:23:39: ←[01;31merror←[0m: unexpected closing bracket `]'

(строка 23 - строка с кодом регулярного выражения)

Что мне делать?

Ответы [ 3 ]

3 голосов
/ 28 февраля 2009

Я не знаю, Nemerle, но похоже, что использование @ отключает все побеги, включая побег для ".

Попробуйте один из них:

def linkrx = Regex("<a\\shref=['\"](.*?)['\"].*?>");

def linkrx = Regex(@"<a\shref=['""](.*?)['""].*?>");

def linkrx = Regex(@"<a\shref=['\x22](.*?)['\x22].*?>");
2 голосов
/ 28 февраля 2009

Я не программист Nemerle, но я знаю, что вы должны ВСЕГДА использовать анализатор XML для данных на основе XML, а не регулярные выражения.

Я предполагаю, что кто-то создал библиотеку DOM или XPath для Nemerle, чтобы вы могли получить доступ либо к

// a [@href] через XPath или что-то вроде a.href.value через DOM.

Это регулярное выражение не нравится, например

<a class="foo" href="something">bar</a>

Я не проверял это, но это должно быть больше похоже на это

/<a\s.+?href=['|\"]([^'\">]+)['|\"].+?>/i
1 голос
/ 28 февраля 2009

Проблема в кавычках, а не в скобках. В Nemerle, как и в C #, вы избегаете кавычки с другой кавычкой, а не обратной косой чертой.

@"<a\shref=['""](.*?)['""].*?>"

РЕДАКТИРОВАТЬ: обратите внимание, что вам не нужна труба внутри квадратных скобок; содержимое обрабатывается как набор символов (или диапазоны символов) с подразумеваемым ИЛИ.

...