2016-05-15 142 views
0

我试着写一组检查的截止日期为域名的功能:字符串比较错误

(ql:quickload 'inferior-shell) 

(defun whois-lookup (site) 
    (let ((request (format nil "whois ~a" site))) 
    (inferior-shell:run/ss request))) 

(defun match-expiration-string (input) 
    (let ((test-string "Registrar Registration Expiration Date:")) 
    (string> input test-string))) 

(defun domain-expiration-date (site) 
    (with-input-from-string (input (whois-lookup site)) 
    (loop for line = (read-line input nil nil) 
      while line do 
      (when (match-expiration-string line) 
       (format t "~A~%~t~A ~%" site line))))) 

我这样称呼它:(domain-expiration-date "startpage.com")

不幸的是,它并没有显示相关的行,而是显示了所有这些行。

match-expiration-string似乎工作正常,所以我不知道是什么问题。

CL-USER> (match-expiration-string "Registrar Registration Expiration Date: 2016-05") 
39 (6 bits, #x27, #o47, #b100111) 
CL-USER> (match-expiration-string "Registrar Registration Expiration ") 
NIL 
+2

'(字符串>“a”“注册商注册到期日期:”)=> 0。您应该使用'STRING ='(必要的关键字参数)来检查子字符串是否完全匹配。或者使用正则表达式。 – jkiiski

+0

有道理。我有一个'string ='的版本,但是显然只有当该行足够长时。所以正则表达式!谢谢! – Pascal

回答

2

至于建议的jkiiski,其工作原理与正则表达式:

(defun match-expiration-string (input) 
    (let ((test-string "Registrar Registration Expiration Date:")) 
    (ppcre:scan test-string input))) 

==>

CL-USER> (domain-expiration-date "startpage.com") 
startpage.com 
Registrar Registration Expiration Date: 2018-10-10T04:00:00Z 
NIL 

像约书亚泰勒说,你不需要正则表达式,只有search。我还注意到,“域名注册到期日:”在每一个域名注册的反应是没有,所以我修改了搜索(在情况下取得的地方,我需要其他的搜索字符串的其他类型畴):

(defun match-expiration-string (input) 
    (let ((inclusion-strings '("Expiration Date:")) 
     (exclusion-strings '("Registrar Registration Expiration Date:"))) 
    (when (some #'(lambda (s) (search s input)) 
       inclusion-strings) 
     (notany #'(lambda (s) (search s input)) 
       exclusion-strings)))) 
+6

而不是一个正则表达式,一个简单的字符串遏制就足够了。也就是说,使用[搜索](http://www.lispworks.com/documentation/HyperSpec/Body/f_search.htm)。文档中的示例甚至基于在另一个字符串中找到一个字符串。 –

+0

谢谢!我会编辑我的答案以反映这一点。 – Pascal