我正在尝试在Emacs中格式化一个游戏。对话框如下所示:
<speaker>Madelon</speaker>
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 ?
<speaker>Cathos</speaker>
我的目标是捕获整个对话框,以及不在<speaker>
标记内的所有内容。
问题在于我只能设法获得第一行,使用此RegEx:
/speaker>\n\n\[A-Z].*\n
我也可以得到第二行,如下:
/speaker>\n\n\[A-Z].*\n.*\n
但这不太方便。我被困在这之后,因为当我尝试
时/speaker>\n\n\[A-Z][.*\n]+
它与任何东西都不匹配。 [.*\n]+
是不是意味着我想要一个或多个“任意数量的字符后跟换行符”?
干杯
答案 0 :(得分:0)
您可以使用RegEx (?<=<\/speaker>)([^<]*)(?=(<speaker>|\n))
(?<=<\/speaker>)
确保</speaker>
在您的比赛开始之前
([^<]*)
匹配任何内容,直到<
(?=(<speaker>|\n))
确保<speaker>
或换行后的换行符
答案 1 :(得分:0)
我不完全清楚,你更准确地想要实现的是什么,也就是说,最终的结果是什么。如果想要使用长篇文本和/或重复文本,Regexps有许多重要的限制。
如果您只想要没有任何发言者注释的对话框,并且所有发言者都在一条线上,您可以快速删除所有命令flush-lines
。这需要regexp并删除包含该行的所有行。 (还有一个名为keep-lines
的反向命令可以删除不包含给定正则表达式的所有内容。)
如果你有更高级的东西,扬声器符号以某种方式折叠到对话框中,你可以考虑使用键盘宏。您可以通过键入C-x (
开始录制,然后键入C-x )
结束录制。然后,您可以通过键入C-x e
重复键盘宏。使其工作的技巧是通过键入尽可能少地假定文本的命令,以使其在您想要编辑的所有实例中有效地工作。这需要一些练习,并且通过了解诸如forward-word
和forward-sexp
之类的命令来帮助提高运动的灵活性。