Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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 关于vim模式匹配的澄清_Regex_Vim - Fatal编程技术网

Regex 关于vim模式匹配的澄清

Regex 关于vim模式匹配的澄清,regex,vim,Regex,Vim,我想将python文件中的5个空格缩进转换为4个空格缩进。我希望命令执行以下操作 删除所有行中以空格开头,后跟字符的单个空格 我发出了命令%s/^\[a-zA-Z]*/,这似乎有效。后来我发现这个命令实际上应该是 在所有行中删除一个空格,该空格以空格开头,后跟任意数量的空格,后跟字符 然而,我仍然无法理解(上面的)命令是如何工作的。基本上,它应该报告以下声明模式的错误,但它仍然有效 class H: def __init__(): hell() 它之所以起作用是因为

我想将python文件中的5个空格缩进转换为4个空格缩进。我希望命令执行以下操作

删除所有行中以空格开头,后跟字符的单个空格

我发出了命令%s/^\[a-zA-Z]*/,这似乎有效。后来我发现这个命令实际上应该是

在所有行中删除一个空格,该空格以空格开头,后跟任意数量的空格,后跟字符

然而,我仍然无法理解(上面的)命令是如何工作的。基本上,它应该报告以下声明模式的错误,但它仍然有效

class H:
     def __init__():
         hell()

它之所以起作用是因为
*
的意思是“匹配上一个原子的零个或多个”。在你的情况下,它匹配零。您可能想改用
\+
,这意味着“匹配前面的一个或多个原子”

实际上,您可以完全删除
*
,因为只有一个空格后跟一个字符,就可以匹配您最初搜索的内容。有更好的正则表达式来表示您要实现的目标,但这不是您在这里要问的

编辑(澄清):

当前的正则表达式(
^\[a-zA-Z]*
)转换为:

  • ^
    :从行首开始
  • \
    :匹配空格
  • [a-zA-Z]
    :后跟一个字母
  • *
    :零次或多次(前一个原子-一个字母)

你不能用4个空格替换每5个空格吗?我发出的命令就是这样做的,后来我想它不应该这样做。我不知道为什么,这意味着它匹配第2行和第3行(如我之前的帖子所示)。但是为什么它会删除第2行和第3行中的单个空格。请尝试以下操作:
:设置hlsearch
,然后
/^\[a-zA-Z]*
。这将显示正则表达式匹配的内容,以及替换命令删除的内容。也许这有助于解释我的答案。@Randy Morris:-我遇到了以下错误:E486:找不到模式:^[a-zA-Z]您使用的是上面的相同代码段吗?有了这个精确的代码段和我从上面进行的精确搜索,我突出显示了第2行和第3行上的第一个空格。@Randy Morris:-我使用的是同一个代码段,但我仍然无法删除它。