我希望匹配所有标点符号,但不匹配“'
”,如“I'm
”。例如,在下面的句子中:
I'm a student, but I'm also working.
^not match ^match ^not ^match
我可以使用“[[:punct:]]+
”来匹配所有标点符号,但我很难从匹配模式中排除“'
”。
当然,我可以使用类似下面的内容来通过枚举来表达,但是它非常繁琐,特别是考虑到所有这些对中文的标点符号。
“[,.?!]
”
请建议更优雅的解决方案。
提前致谢,
于
答案 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现在支持角色课程。
再次感谢。
于