Lisp вроде не сильно распростарнен. Это его тут в универах учат?
Звпости сюда вопросы — может у кого идеи из общих соображений будут?
Lisp вроде не сильно распростарнен. Это его тут в универах учат?
Звпости сюда вопросы — может у кого идеи из общих соображений будут?
Для отправки комментария вам необходимо авторизоваться.
[quote="Олен":2khjqa1v]
[/quote:2khjqa1v]
Вау , поиск с подстроками кошерней? Удивительное рядом
Наверняка можно, толькоя этих функций не знаю, а регэкспы — универсальней и правильней я щитаю
Категорически согласен…
[quote="OlgaT":2x750i59]опубликовать некоторые системные данные компьютера (в том числе айпи) средствами emacs lisp.[/quote:2x750i59]
А почему для этого не использовать системные утилиты и шелл-скриптинг?
Он точно самодур…
[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 или больше
? — жадность. чтобы не выбрало до конца файла, тогда оно закрывающий тег не найдет и вообще вернет фолс
\\ перед скобками добавляется для экранирования т.е, чтобы етот лисп не решил, что это его собственное выражение в скобках похоже. т.к. это у него главный символ.
уф.
ну вот.
единственное что мне не понятно в моем коде, — почему мессадж, написанный сразу в иф блоке, не выводит мое сообщение. А вот сразу после — выводит. Хотя как ты и говорила, в джаве это бы не прошло вообще — неинициализированная переменная. Ну да и фиг с ними — думаю это не требуется
ну все пока.
ЗЫ привет от Кургиных. Они сочувствуют, что тебя так загружают.
[quote="OlgaT":kpt76khw][quote="Олен":kpt76khw]
значит по порядку.
[/quote:kpt76khw]
Спасибо, Олен! Я только не поняла одну вещь:
«На самом деле, в этом простейшем варианте, где нет вложенных тегов, это выражением можно сократить до…»
Что значит нет вложенных тегов? Если внутри спанов больше нет других тэгов, то почему я не могу использовать простейший вариант?
За привет спасибо, им тоже от меня привет, давно не виделись.
[/quote:kpt76khw]
можно использовать, все работает.