如果找到匹配则返回一行文本

时间:2012-11-23 13:01:40

标签: lisp newlisp

如果找到匹配项,我在解决如何返回一行文字方面遇到了一些麻烦。

(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 个答案:

答案 0 :(得分:1)

这可以简单地通过使用string-split过程来执行,该过程允许我们使用remove-iffilter的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))