如何匹配除特定字符以外的任何非空白字符?


111

在Perl中\S匹配任何非空白字符。

如何匹配除反斜杠之外的任何非空白字符\

Answers:


154

您可以使用字符类

/[^\s\\]/

匹配不是空格字符也不是的任何内容\。这是另一个例子:

[abc]手段“匹配abc”; [^abc]手段“匹配除了任意字符ab或者c”。


什么时候^解释为否定,什么时候解释为行的开头?在这方面,所以这不会匹配行开头空格的数量$0~/\s*^\s/
亚历山大中央陆军

1
在字符类之外,它是“字符串的开头”(或一行,具体取决于当前的匹配模式)。在字符类内部,并且仅当它是左括号之后的第一个字符时,它才否定字符类的内容。
蒂姆·皮茨克

这会否与一些白色的空间开始下面的比赛行$0~/\s*^\s/之后是不是一个空格的任何字符
亚历山大中央陆军

1
那应该是/^\s+/-行首,然后是一个或多个空格字符。
蒂姆·皮茨克

1
@AlexanderCska,你知道了吗?上面的答案只会返回字符串的第一个匹配项。如果要返回所有匹配项,请添加g修饰符。/[^\s\\]/g
本·卡尔

14

您可以先行使用:

/(?=\S)[^\\]/

2
如果不是空格,它将向前看。然后,否定类接受除类中的字符以外的任何内容(不是空格)。
丹尼斯·德伯纳迪

我喜欢这个解决方案。这对于“给我除空格以外的所有非单词字符”这样的事情有好处:/(?=\S)\W/
jocull

我遇到一种情况,我需要匹配任何非空格字符以及非引号。它还必须考虑到空间。例如:THIS IS A TEST, AND AGAIN。以下对我来说很有效(?=\S)[^"]*
Arvo Bowen

接受的答案对我不起作用,但是对我有用。我在崇高的文本正则表达式搜索中使用了此代码
Christian Noel

5

这对我使用sed有用 [ 编辑:以下注释指出sed不支持\ s]

[^ ]

[^\s] 

没有

# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg

echo "ghai ghai" | sed "s/[^ g]//g"
g g

3
\s匹配的不只是空格字符。它包括TAB,换行符回车符和其他(还有多少取决于正则表达式的风格)。这是Perl的发明,最初是POSIX字符类的简写,但[:space:]不支持sed。您上面的第一个regex应该是s/[^[:space:]g]//g
艾伦·摩尔

Yup @AlanMoore作品:echo "ghai ghai" | sed "s/[^[:space:]g]//g" 产量:g g
storm_m2138 '16

1

在我的系统上:CentOS 5

我可以\s在集合外部使用,但必须[:space:]在集合内部使用。实际上,我[:space:]只能在内部集合中使用。因此,要使用此空间匹配单个空间,我必须使用“ [[:space:]] 这真的很奇怪”。

echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"

Result: a b cX
  • 我匹配的第一个空格 \s
  • 我与之匹配的第二个空格 [[:space:]]
  • XI匹配“所有但没有空间” [^[:space:]]

这两个将不起作用:

a[:space:]b  instead use a\sb or a[[:space:]]b

a[^\s]b      instead use a[^[:space:]]b

1
从sed 4.4开始,显然仍然必须使用([^[:space:]])代替([^\s])。我在openSUSE Tumbleweed公司2018 04 03
user2394284
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.