如果找到匹配项,我在解决如何返回一行文字方面遇到了一些麻烦。
(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"
答案 0 :(得分:1)
这可以简单地通过使用string-split
过程来执行,该过程允许我们使用remove-if
(filter
的Common Lisp版本)来搜索通过换行删除任何行的字符串不包含我们正在搜索的字符串。这将导致包含字符串的每一行的列表。我们将在这里定义的函数已经可以通过各种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))
您应该能够通过一些小的修改将此策略应用于您发布的代码。此代码在Mac OS X 10.7.5上的ANSI Common Lisp的SBCL 1.0.55.0-abb03f9上进行了测试。
答案 1 :(得分:1)
最后我使用了:
(find-all (string routerMAC ".*") (get-url wireshark))