寻求适配模式的正则表达式:Emacs剧本完整对话捕获需求
我来帮你搞定Emacs里处理剧本对话的正则问题!你的剧本是<speaker>名字</speaker> 台词的结构,要捕获完整对话内容,我们可以针对这个结构设计精准的正则,同时适配多行台词的场景。
核心正则表达式(支持单行/多行台词)
针对你的对话模式,这个Emacs原生正则可以匹配完整的对话单元(包括跨多行的台词):
\<speaker>\([^<]*\)</speaker>\s*\(.*\(?:\n.*\)*\)\(?=\<speaker>\|$)
正则拆解:
\<speaker>:精准匹配开头的说话者标签\([^<]*\):捕获说话者的名字(直到</speaker>的<符号为止)</speaker>:匹配说话者标签的结尾\s*:匹配标签和台词之间的任意空白(空格、换行都能覆盖)\(.*\(?:\n.*\)*\):捕获所有台词内容,包括跨多行的文本\(?=\<speaker>\|$):正向预查,确保匹配到下一个<speaker>标签或者文档结尾就停止,不会误包含后面的对话
快速格式化对话(用query-replace-regexp)
如果你只是想快速把剧本改成更易读的样式,比如加粗说话者、用引用块包裹台词,可以这么操作:
打开你的剧本文件
按下
M-x输入query-replace-regexp回车输入上面的正则表达式,回车
输入替换模板,比如:
**\1:** > \2回车后,Emacs会自动把所有对话转换成清晰的格式:
Madelon:Mon Dieu, que vous êtes vulgaire ! Pour moi, un de mes étonnements, c'est que vous ayez pu faire une fille si spirituelle que moi. A-t-on jamais parlé, dans le beau style, de Cathos ni de Madelon, et ne m'avouerez-vous pas que ce serait assez d'un de ces noms pour décrier le plus beau roman du monde ?
Cathos:
你的台词内容
批量提取所有对话到新缓冲区(Elisp函数)
如果需要把所有对话单独提取出来整理,可以用这个自定义函数:
(defun extract-script-dialogue () (interactive) (let ((dialogues '())) ;; 从文档开头开始搜索 (goto-char (point-min)) ;; 循环匹配所有对话单元 (while (re-search-forward "\<speaker>\([^<]*\)</speaker>\s*\(.*\(?:\n.*\)*\)\(?=\<speaker>\|$)" nil t) (push (cons (match-string 1) (string-trim (match-string 2))) dialogues)) ;; 创建新缓冲区展示提取结果 (with-current-buffer (get-buffer-create "*Script Dialogues*") (erase-buffer) (dolist (dialog (reverse dialogues)) (insert (format "**%s:**\n> %s\n\n" (car dialog) (cdr dialog)))) (display-buffer "*Script Dialogues*")) (message "已提取 %d 条对话" (length dialogues))))
使用方法:把这段代码复制到你的Emacs配置文件(比如~/.emacs.d/init.el),重启Emacs或者用M-x eval-buffer加载,然后运行M-x extract-script-dialogue,就能看到所有整理好的对话啦!
内容的提问来源于stack exchange,提问作者Arnaud Stephan

