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

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

除了反斜杠 \之外,如何匹配任何非空格字符?

261110 次浏览

你可以使用前瞻:

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

你可以使用 性格类:

/[^\s\\]/

匹配任何既不是空白字符也不是 \的东西:

[abc]表示“匹配 abc”; [^abc]表示“匹配除 abc之外的任何字符”。

使用 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

在我的系统上: 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:]]交替匹配
  • X I 与“所有但没有空间”[^[:space:]]匹配

这两种方法行不通:

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


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

如果在 bashgrep中使用正则表达式,而不仅仅是在 perl 中,那么 \S就不能匹配所有非空白字符。然而,相当于 \S的是 [^\r\n\t\f\v ]

因此,与 这个不同的是:

[^\s\\]

... 您必须这样做,以匹配没有空格字符(正则表达式: \r\n\t\f\v ) 还有没有反斜杠(\; 正则表达式: \\)

[^\r\n\t\f\v \\]

参考文献:

  1. [我的回答] Unix & Linux: 任何非空格正则表达式

在这种情况下,将“没有反斜杠的非空白”定义为“空白或反斜杠”更容易,如 公认的答案显示:

/[^\s\\]/

但是,对于较复杂的问题,正则表达式集特性可能很方便。您可以对字符类执行设置操作以获得所需的内容。这个函数从非空格字符的集合中减去反斜杠:

use v5.18;
use experimental qw(regex_sets);


my $regex = qr/abc(?[ [\S] - [\\] ])/;




while( <DATA> ) {
chomp;
say "[$_] ", /$regex/ ? 'Matched' : 'Missed';
}


__DATA__
abcd
abc d
abc\d
abcxyz
abc\\xyz

输出显示空格和反斜杠都不匹配 c之后:

[abcd] Matched
[abc d] Missed
[abc\d] Missed
[abcxyz] Matched
[abc\\xyz] Missed

当较大的集合难以优雅地表达并且集合操作可以对其进行细化时,这就变得更加有趣了。我更愿意在这个例子中看到 set 操作:

[b-df-hj-np-tv-z]
(?[ [a-z] - [aeiou] ])