在Perl中,
如何匹配除反斜杠
\S
匹配任何非空格字符。如何匹配除反斜杠
\
以外的任何非空白字符?你可以使用向前查看:
/(?=\S)[^\\]/
/(?=\S)\W/
。 - jocullTHIS IS A TEST, AND AGAIN
。下面的正则表达式对我非常有效:(?=\S)[^"]*
。 - Arvo Bowen/(?=\W)[^-]/g
。 - Taufik Nurhidayat对我而言,使用 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
\s
不仅匹配空格字符,还包括制表符、换行符、回车符等(具体有多少取决于正则表达式的语法)。这是 Perl 发明的,最初是 POSIX 字符类 [:space:]
的速记方式,并且不受 sed
支持。您上面的第一个正则表达式应该是 s/[^[:space:]g]//g
。 - Alan Mooreecho "ghai ghai" | sed "s/[^[:space:]g]//g"
,输出结果为:g g
。 - storm_m2138在我的系统上: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:]]
来交替匹配第二个空格[^[:space:]]
来匹配除空格以外的任何字符X以下两种方法不起作用:
a[:space:]b instead use a\sb or a[[:space:]]b
a[^\s]b instead use a[^[:space:]]b
([^[:space:]])
而非([^\s])
。我正在使用openSUSE Tumbleweed 2018 04 03。 - user2394284/[^\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
当更大的集合难以优雅地表达时,使用集合操作可以使其更加精细。在这个例子中,我更愿意看到集合操作:
[b-df-hj-np-tv-z]
(?[ [a-z] - [aeiou] ])
[^\s\\]
......你需要这样做,以匹配无空格字符(正则表达式:\r\n\t\f\v
)和无反斜杠(\
; 正则表达式:\\
)
[^\r\n\t\f\v \\]
^
被解释为否定时,何时被解释为行开头?在这方面,为什么$0~/\s*^\s/
不能匹配以一定数量的空格开头的行? - Alexander Cska$0~/\s*^\s/
,后面跟着任何非空格字符? - Alexander Cska/^\s+/
- 行首加上一个或多个空白字符。 - Tim Pietzcker/[^\s\\]/g
- Ben Carp