Regex Emacs正则表达式:匹配模式之间跨越多行的任何字符
我想找到Regex Emacs正则表达式:匹配模式之间跨越多行的任何字符,regex,emacs,Regex,Emacs,我想找到I-I-并用I-替换它 可以是任何内容,包括制表符、换行符、空格、*、等等 例如:I-John M.Smith I-应替换为I-John M.Smith,I- 我试过这样的方法: M-x Query replace regexp \(I - \)\([a-z]+\) \(I - \) \1\2, \3 它不起作用。您能帮忙吗?这可以通过对正则表达式进行一些调整来实现 输入 命令 请注意,上面的匹配正则表达式实际上更像这样 \(I - \)\(\(.*?\n\)*?.*?\)\( I -
I-I-
并用I-
替换它
可以是任何内容,包括制表符、换行符、空格、*、等等
例如:I-John M.Smith I-
应替换为I-John M.Smith,I-
我试过这样的方法:
M-x Query replace regexp
\(I - \)\([a-z]+\) \(I - \)
\1\2, \3
它不起作用。您能帮忙吗?这可以通过对正则表达式进行一些调整来实现 输入 命令 请注意,上面的匹配正则表达式实际上更像这样
\(I - \)\(\(.*?\n\)*?.*?\)\( I - \)
…使用表示换行符的\n
。在微型缓冲区中,您需要输入\n
作为C-q C-j
输出
解释
你的正则表达式在字符类<代码> [AZ] +<代码>中间匹配。但是你也说,
可以是任何内容,包括制表符、换行符、空格、*、&等 为了支持这一点,我们可以更改为*
,以匹配任何字符。但是,这可能会消耗太多的输入,因此我们使用?
进行延迟匹配。最后一个棘手的问题是多行匹配,因为你说过可能会有新行。为了支持这一点,我们添加了\n
处理
看看中间部分,我们有
\(\(.*?\n\)*?.*?\)
…您可以将其理解为“匹配任意数量的字符(延迟),然后换行任意次数(延迟),然后再次匹配任意数量的字符(延迟以避免消耗到行的尾部I-
部分)
工具书类
M-x regex builder
以交互方式构建regex,或者使用regex101.com获得更多帮助更正:M-x regexp builder
确实regexp builder
非常有用。对于查询/替换,我更喜欢使用Isearch,后跟C-M-%,因此您还可以逐步查看匹配的内容(但不可否认的是亚组)例如,做以下事情:C-u C-s\(I-)\([a-z]+\)\(I-)C-M-%\1\2,3 RET
。你可以简化为:\(I-)*(I-)
\1,2
(其中,^J
表示换行符,如前所述,换行符应键入为C-q C-J
。请注意,\(?:…)
是非捕获组,这就是为什么\2
不是\3
)
\(I - \)\(\(.*?\n\)*?.*?\)\( I - \)
I - abc, I -
I - defgh, I -
I - John M. Smith, I -
I - 1234567, I -
I - 12345
67, I -
I - 12345
6789ABC
DE F G H IJK
LM N O P, I -
\(\(.*?\n\)*?.*?\)