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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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 \w不';在vim搜索替换中不起作用,但a-zA-Z起作用? 太长,读不下去了_Regex_Search_Vim_Replace - Fatal编程技术网

Regex \w不';在vim搜索替换中不起作用,但a-zA-Z起作用? 太长,读不下去了

Regex \w不';在vim搜索替换中不起作用,但a-zA-Z起作用? 太长,读不下去了,regex,search,vim,replace,Regex,Search,Vim,Replace,[a-zA-Z\.-]在Vim regex search replace中工作,但[\w\.-]不工作 我正在搜索的文本: 期望输出 我的问题 为什么这样做有效: :%s/\v^\d+\s+([a-zA-z\.-]+)\s+.*/\1/g 但这并不是: :%s/\v^\d+\s+([\w\.-]+)\s+.*/\1/g E486:找不到模式:%s/\v^\d+\s+([\w\.-]+)\s+.*/\1/g 两者之间的唯一区别是方括号内的a-zA-Zvs\w。但是\w是否等于a-zA-Z(加上

[a-zA-Z\.-]
在Vim regex search replace中工作,但
[\w\.-]
不工作

我正在搜索的文本: 期望输出 我的问题 为什么这样做有效:

:%s/\v^\d+\s+([a-zA-z\.-]+)\s+.*/\1/g
但这并不是:

:%s/\v^\d+\s+([\w\.-]+)\s+.*/\1/g
E486:找不到模式
:%s/\v^\d+\s+([\w\.-]+)\s+.*/\1/g

两者之间的唯一区别是方括号内的
a-zA-Z
vs
\w
。但是
\w
是否等于
a-zA-Z
(加上本例文本中未包含的一些其他非空白字符)

我使用默认的vim。未经修改。Ubuntu随附的一切

非vim平台 当我尝试使用atom文本编辑器而不是vim时,这两个表达式都可以工作

搜索:
^\d++\s+([a-zA-z\.-]+)\s++.
替换:
$1

当我尝试使用这两种表达时,效果都很好。(尽管我必须添加多行标记)

我试过的其他事情 我的理解是
\v
是避免逃离地狱的必要条件。我试过不用它:

:%s/^\d\+\s\+\([a-zA-Z\.-]\+\)\s\+.*/\1/g
工作

不起作用。(“未找到模式”)

我还尝试添加了
m
标志(因此结尾是
/gm
),但没有成功

E488:尾随字符

我也尝试过不使用
^

:%s/\d\+\s\+\([\w\.-]\+\)\s\+.*/\1/g
E486:找不到模式:
\d\+\s\+\([\w\.-]\+\)\s\+.*

我还尝试使用
\\w
而不是
\w

:%s/\d\+\s\+\([\\w\.-]\+\)\s\+.*/\1/g
E486:找不到模式:
\d\+\s\+\([\\w\.-]\+\)\s\+.*

我还尝试使用
\[\]
而不是
[]

:%s/\d\+\s\+\(\[\\w\.-\]\+\)\s\+.*/\1/g
E486:找不到模式:
\d\+\s\+\(\[\\w\.-\]\+\)\s\+.*

[a-zA-Z\.-]
在Vim regex search replace中工作,但
[\w\.-]
不工作

[a-zA-Z\.-]
是包含以下内容的字符集合:

  • a
    z
    的每个字符
  • A
    Z
    的每个字符
  • 字符
  • 和字符
    -
:help/collection
很遗憾没有明确说明这一点,但是像
\w
这样的字符类被解释为“转义
w
”,因此“普通
w
”,所以
[\w\.-]
实际上只是
[w\.-]
,这不是您想要的:

  • 字符
    w
  • 字符
  • 和字符
    -

vim不支持有意义的character classesOk中的转义字符。我怎么做
[\w]
?我已经试过了
[\\w]
。在这种情况下,我可以执行
a-zA-Z
,但我想知道,在键入完整的系列是超长的情况下(例如
\S
),您为什么要执行
[\w]
[\S]
?如果它起作用,它将严格等同于
\w
\S
,因此没有任何好处。作为替代,请参阅
:help[:alnum:
和相关的字符类表达式。对不起,当我说
[\w]
时,我指的是有
\w
和其他内容的组。(例如
[\w\.]
)<代码>[:alnum::\.-]确实有效。谢谢然而,如果我需要学习一组定制的长魔术字符串,因为Vim不能理解规范正则表达式,我不认为使用Vim有什么意义。我要回到Nano,你可以自由使用任何你想要的工具,也可以不费吹灰之力去学习它。
:%s/\d\+\s\+\([\w\.-]\+\)\s\+.*/\1/g
:%s/\d\+\s\+\([\\w\.-]\+\)\s\+.*/\1/g
:%s/\d\+\s\+\(\[\\w\.-\]\+\)\s\+.*/\1/g