无法找到合适的正则表达式以适应模式

时间:2018-03-22 15:51:03

标签: regex emacs

我正在尝试在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]+是不是意味着我想要一个或多个“任意数量的字符后跟换行符”?

干杯

2 个答案:

答案 0 :(得分:0)

您可以使用RegEx (?<=<\/speaker>)([^<]*)(?=(<speaker>|\n))

  • (?<=<\/speaker>)确保</speaker>在您的比赛开始之前

  • ([^<]*)匹配任何内容,直到<

  • (?=(<speaker>|\n))确保<speaker>或换行后的换行符

Demo.

答案 1 :(得分:0)

我不完全清楚,你更准确地想要实现的是什么,也就是说,最终的结果是什么。如果想要使用长篇文本和/或重复文本,Regexps有许多重要的限制。

如果您只想要没有任何发言者注释的对话框,并且所有发言者都在一条线上,您可以快速删除所有命令flush-lines。这需要regexp并删除包含该行的所有行。 (还有一个名为keep-lines的反向命令可以删除包含给定正则表达式的所有内容。)

如果你有更高级的东西,扬声器符号以某种方式折叠到对话框中,你可以考虑使用键盘宏。您可以通过键入C-x (开始录制,然后键入C-x )结束录制。然后,您可以通过键入C-x e重复键盘宏。使其工作的技巧是通过键入尽可能少地假定文本的命令,以使其在您想要编辑的所有实例中有效地工作。这需要一些练习,并且通过了解诸如forward-wordforward-sexp之类的命令来帮助提高运动的灵活性。