优雅的正则表达式匹配所有标点但不是emacs Lisp中的“'”?

时间:2009-12-12 21:44:29

标签: regex regex-negation

我希望匹配所有标点符号,但不匹配“'”,如“I'm”。例如,在下面的句子中:

I'm a student, but I'm also working. 
 ^not match  ^match ^not           ^match

我可以使用“[[:punct:]]+”来匹配所有标点符号,但我很难从匹配模式中排除“'”。

当然,我可以使用类似下面的内容来通过枚举来表达,但是它非常繁琐,特别是考虑到所有这些对中文的标点符号。 “[,.?!]

请建议更优雅的解决方案。

提前致谢,

2 个答案:

答案 0 :(得分:3)

如果你的正则表达式支持环顾四周,你可以这样做:

(?!')[[:punct:]]

用简单的英语:如果在向前看时没有单引号,则匹配任何标点符号

答案 1 :(得分:1)

感谢Bart的回答和所有评论。在Bart的启发下,我检查了emacs似乎仍然不支持先行。但在精神上,我编写了以下内容:

(defun string-match-but-exclude(regexp string exclusion& optional start)

“返回字符串中regexp的第一个匹配开始的索引,或者为nil, 但排除常规快递。 匹配忽略大小写如果case-fold-search' is non-nil. If third arg start is non-nil, start search at that index in string. For index of first char beyond the match, do (match-end 0). 匹配结束'和'匹配开始'也给出子串的索引 与模式中的括号构造匹配。

您可以使用函数`match-string'来提取子字符串 与regexp中的括号结构匹配。“

(let((data nil))

(and (string-match regexp string start)

   ;; keep the match-data for recovery at the end. 

   (setq data (match-data))

   (not (string-match (concat "[" exclusion "]") (match-string 0 string)))

   (progn (set-match-data data) t) ; To recover the match data, and make sure it produces t as returned value

   (match-beginning 0)

   ))

所以对于(?!')[[:punct:]]字符串“'”的等效表达式,

它将是

(string-match-but-exclude“[[:punct:]]”string“'”)

这可以胜任,但不是那么优雅。它应该是emacs的一个小小的补充,以使其成为内置支持。

emacs现在支持角色课程。

再次感谢。