Вернуть строку текста, если совпадение найдено
У меня возникли проблемы с разработкой, как вернуть строку текста, если найдено совпадение.
(set 'wireshark "http://anonsvn.wireshark.org/wireshark/trunk/manuf")
(set 'arptable (map (fn (x) (parse x " ")) (exec "arp -a")))
(define (cleanIPaddress x)
(slice x 1 -1))
(define (cleanMACaddress x)
(upper-case (join (slice (parse x ":") 0 3) ":")))
(define (addIPandMACaddress x)
(list (cleanIPaddress (nth 1 x)) (cleanMACaddress (nth 3 x))))
(set 'arplist (map addIPandMACaddress arptable))
(set 'routerMAC (last (assoc (exec "ipconfig getoption en1 router") arplist)))
(find-all routerMAC (get-url wireshark))
возвращается
("20:AA:4B")
так что я знаю, что код "работает"
но я хотел бы получить полную строку текста
"20:AA:4B Cisco-Li # Cisco-Linksys, LLC"
2 ответа
В итоге я использовал:
(find-all (string routerMAC ".*") (get-url wireshark))
Это можно сделать просто с помощью string-split
процедура, которая позволяет нам использовать remove-if
(версия Common Lisp filter
) искать строку, разделенную символами новой строки, удаляя все строки, которые не содержат искомую строку. Это привело бы к списку каждой строки, содержащей строку. Функции, которые мы здесь определим, уже доступны через различные библиотеки Common Lisp, но для образовательных целей мы определим их все сами. Код, который вам нужен, работает так:
; First we need a function to split a string by character
(defun string-split (split-string string)
(loop with l = (length split-string)
for n = 0 then (+ pos l)
for pos = (search split-string string :start2 n)
if pos collect (subseq string n pos)
else collect (subseq string n)
while pos))
; Now we will make a function based on string-split to split by newlines
(defun newline-split (string)
(string-split "
" string))
; Finally, we go through our text searching for lines that match our string.
; Make sure to replace 'needle' with the string you wish to search for.
(remove-if #'(lambda (x)
(equal 'nil (search (string-upcase "needle")
(string-upcase x))))
(newline-split haystack))
Вы сможете применить эту стратегию к коду, который вы разместили, с небольшими изменениями. Этот код был протестирован на SBCL 1.0.55.0-abb03f9, реализации ANSI Common Lisp, на Mac OS X 10.7.5.