Lisp вроде не сильно распростарнен. Это его тут в универах учат?

Звпости сюда вопросы — может у кого идеи из общих соображений будут?

Комментариев нет

  1. [quote="Олен":2khjqa1v]
    Вау , поиск с подстроками кошерней? Удивительное рядом
    Наверняка можно, толькоя этих функций не знаю, а регэкспы — универсальней и правильней я щитаю :roll:[/quote:2khjqa1v]
    Категорически согласен…

  2. [quote="OlgaT":2x750i59]опубликовать некоторые системные данные компьютера (в том числе айпи) средствами emacs lisp.[/quote:2x750i59]
    А почему для этого не использовать системные утилиты и шелл-скриптинг?

  3. [quote="OlgaT":f9eabbbk][quote="Олен":f9eabbbk]вот так работает

    (defun ip ()
    (interactive)
    (set-buffer (url-retrieve-synchronously «http://whatsmyip.net/»))
    (goto-char(point-min))
    (if (re-search-forward «<span>\\([^<]+?\\)</span>» nil nil 1)
    (setq m (match-string 1))

    )
    (message «My IP: %s» m)[/quote:f9eabbbk]

    Олен, спасибо огромное! Не могли бы Вы мне объяснить, почему оно работает, в частности, что за выражение между спанами и почему нужно было задавать его полностью, то есть почему не срабатывало на поиск первого спана.[/quote:f9eabbbk]

    значит по порядку.
    Выражение между спанами, как уже писали — регексп. Регулярные выражение — общепринятое средство для анализа строк. Настолько общепринятое, что из юникса, оно перешло в винды .НЕТ и активно там используется. Юниксовые языки, типа Perl, grep, вообще нельзя представить без регекспов. Лисп возможно ты видишь в последний раз, а регекспы вряд ли.

    Задачу на поиск и замену подстрок, если она сложнее чем поиск фиксированной подстроки, удобнее и правильнее решать с помощью регекспа. К примеру, в данном примере, альтернатива могла выглядеть так. 1. Поиск <span> 2. проверка что найденно 3. поиск </span> 3. проверка что найдено. 4. выкусывание substring между этими двумя позициями.
    Регексп позволяет сделать это одним условием.

    Теперь о том, что там написано.
    НАша задача — найти строку между тегами<span></span>
    Выражение выглядит следующим образом (без всякого экранирования )

    «<span>([^<]+?)</span>»
    что значит — ищем отрывающий тег : <span>
    после этого мы должны запомнить все что написано до того, как найдется закрывающий тег </span>
    в других языках () добавляются для выделения группы символов в регекспе. Здесь без скобок не срабатывает match-string

    В группу мы включаем символы по следующему принципу:
    + — один или больше символов НЕ равных <
    Чтобы задать это отрицание, используется выражение [^<] — в квадратных скобках перечисляются ВСЕ символы, которых НЕ должно быть в выражении. Если крышки ^ нет, то это будет означать наоборот — разрешенные символы.
    знак вопроса в данном случае обозначает greedy — т.е. найти самую короткую подстроку, удовлетворяющую условиям.

    Короче одним предложением говорится так — выбрать подстроку заключеннцю между тегом <span>, в которой все символы, не равны <

    На самом деле, в этом простейшем варианте, где нет вложенных тегов, это выражением можно сократить до
    (if (re-search-forward «<span>\\(.*?\\)</span>» nil nil 1)
    что значит выбрать 0 или больше любых симоволов но только пока не встретиться </span>

    . — любой символ
    * — 0 или больше
    ? — жадность. чтобы не выбрало до конца файла, тогда оно закрывающий тег не найдет и вообще вернет фолс

    \\ перед скобками добавляется для экранирования т.е, чтобы етот лисп не решил, что это его собственное выражение в скобках похоже. т.к. это у него главный символ.

    уф.

    ну вот.

    единственное что мне не понятно в моем коде, — почему мессадж, написанный сразу в иф блоке, не выводит мое сообщение. А вот сразу после — выводит. Хотя как ты и говорила, в джаве это бы не прошло вообще — неинициализированная переменная. Ну да и фиг с ними — думаю это не требуется

    ну все пока.

    ЗЫ привет от Кургиных. Они сочувствуют, что тебя так загружают.

  4. [quote="OlgaT":kpt76khw][quote="Олен":kpt76khw]
    значит по порядку.
    [/quote:kpt76khw]
    Спасибо, Олен! Я только не поняла одну вещь:
    «На самом деле, в этом простейшем варианте, где нет вложенных тегов, это выражением можно сократить до…»
    Что значит нет вложенных тегов? Если внутри спанов больше нет других тэгов, то почему я не могу использовать простейший вариант?

    За привет спасибо, им тоже от меня привет, давно не виделись. :)[/quote:kpt76khw]

    можно использовать, все работает.

Ответить