2016-05-15 4 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

'(:(私は、ドメインの他のタイプのために他の検索文字列を必要とする場合には場所を作った)すべてのWHOIS応答ではありませんでしたので、私は、検索を修正:私はまた、「レジストラ登録の有効期限は、」気づい文字列> "a" "レジストラ登録有効期限:")=> 0。部分文字列が正確に一致するかどうかを確認するには、 'STRING ='(必要なキーワード引数を使用)を使用する必要があります。または、正規表現を使用します。 – jkiiski

+0

意味があります。 'string ='で動作するバージョンがありましたが、明らかにその行が十分に長い場合に限ります。だからRegexそれは!ありがとうございました! – 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