Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Emacs正则表达式:匹配模式之间跨越多行的任何字符_Regex_Emacs - Fatal编程技术网

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-
部分)

工具书类

FYI:您可以使用
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\)*?.*?\)