在 Perl\S中匹配任何非空格字符。
\S
除了反斜杠 \之外,如何匹配任何非空格字符?
\
你可以使用前瞻:
/(?=\S)[^\\]/
你可以使用 性格类:
/[^\s\\]/
匹配任何既不是空白字符也不是 \的东西:
[abc]表示“匹配 a、 b或 c”; [^abc]表示“匹配除 a、 b或 c之外的任何字符”。
[abc]
a
b
c
[^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:]] 这真的很奇怪。
\s
[:space:]
[[:space:]]
echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/" Result: a b cX
[^[:space:]]
这两种方法行不通:
a[:space:]b instead use a\sb or a[[:space:]]b a[^\s]b instead use a[^[:space:]]b
如果在 bash或 grep中使用正则表达式,而不仅仅是在 perl 中,那么 \S就不能匹配所有非空白字符。然而,相当于 \S的是 [^\r\n\t\f\v ]。
bash
grep
[^\r\n\t\f\v ]
因此,与 这个不同的是:
[^\s\\]
... 您必须这样做,以匹配没有空格字符(正则表达式: \r\n\t\f\v ) 还有没有反斜杠(\; 正则表达式: \\)
\r\n\t\f\v
\\
[^\r\n\t\f\v \\]
在这种情况下,将“没有反斜杠的非空白”定义为“空白或反斜杠”更容易,如 公认的答案显示:
但是,对于较复杂的问题,正则表达式集特性可能很方便。您可以对字符类执行设置操作以获得所需的内容。这个函数从非空格字符的集合中减去反斜杠:
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] ])