使用正则表达式从lisp中的字符串中删除单词

使用正则表达式从lisp中的字符串中删除单词,lisp,elisp,common-lisp,Lisp,Elisp,Common Lisp,我有一个类似这样的字符串列表,称为F: (“hello word i'am walid”“再见夫人”)=>此列表包含两个字符串元素 我还有另一个类似的列表调用(“单词”“夫人”)=>这包含两个单词 现在我想从列表F的每个字符串中删除列表S的元素,输出应该是这样的(“hello I'am walid”“再见”) 我已经找到了这个函数: (defun remove-string (rem-string full-string &key from-end (test #'eql)

我有一个类似这样的字符串列表,称为F:

(“hello word i'am walid”“再见夫人”)=>此列表包含两个字符串元素

我还有另一个类似的列表调用(“单词”“夫人”)=>这包含两个单词

现在我想从列表F的每个字符串中删除列表S的元素,输出应该是这样的(“hello I'am walid”“再见”)

我已经找到了这个函数:

(defun remove-string (rem-string full-string &key from-end (test #'eql)
                  test-not (start1 0) end1 (start2 0) end2 key)
"returns full-string with rem-string removed"
(let ((subst-point (search rem-string full-string 
                         :from-end from-end
                         :test test :test-not test-not
                         :start1 start1 :end1 end1
                         :start2 start2 :end2 end2 :key key)))
(if subst-point
    (concatenate 'string
                 (subseq full-string 0 subst-point)
                 (subseq full-string (+ subst-point (length rem-string))))
    full-string)))
例如: (删除字符串“walid”“hello i'am walid”)=>输出“hello i'am”

但有一个问题

例如:

(remove-string "wa" "hello i'am walid") => the output "hello i'am lid"
但是输出应该是“hello i'am walid”,换句话说,我不会从字符串中删除确切的单词

我有一个解决办法就是使用

cl-ppcre:regex-replace-all "\\s*\\bwa\\b\\s*" "ba wa walid" " ")
这很好,但有一个问题
cl ppcre:regex replace all“\s*\bam\b\s*”“i'am wa walid”“”=>“i'am wa walid”和它不应该我应该有“i'am wa walid”,因为“i'am”是一个空字

您可以显式定义边界字符,而不用
\b
。下面我使用空格、逗号、字符串的开头或结尾或句点作为边界字符

(cl-ppcre:regex-replace-all 
   #?r"(\s|^|$|,|\.)(am)(\s|^|$|,|\.)" 
   "i'am wa walid" 
   #?r"\1 \3")
(注意:
#?\r“
来自
cl interpol:enable interpol syntax
,使正则表达式更易于阅读)

如果我们使用的是国际刑警组织,那么它也可以包含我们单词的拼接点:

(let ((word "am"))
  (cl-ppcre:regex-replace-all 
     #?r"(\s|^|$|,|\.)(${word})(\s|^|$|,|\.)" 
     "i'am wa walid" 
     #?r"\1 \3")

干杯,希望我回答的是正确的问题

你能诚实地自己重读这个问题并说它有意义吗?我理解语言问题,但看起来你根本没有校对过。这不是获得(免费)帮助的最佳方法。上面的答案是:
(注意:#?\r“来自cl interpol:启用interpol语法并使正则表达式更易于阅读)
。您可以决定不使用cl interpol并将所有反斜杠加倍,然后使用
concat
format
将单词放入正则表达式中。