我有一个Perl正则表达式/\W/i
,它匹配所有非字母数字字符,但它也匹配我想忽略的空格。如何使其与空格以外的非字母数字字符匹配?
答案 0 :(得分:14)
您可以使用
/[^\w\s]/
这匹配所有非单词字符(\ w)和非空格字符(\ s)。
修改强>
/[^\w ]/
如果你只想忽略空格(不是所有的空格)。
更新:
删除了i
,因为它不需要(请参阅几条评论)。
答案 1 :(得分:8)
对于大多数用途,[^\w\s]
应该足够了。这只匹配一个既不是“alphanum”也不是PerlSpace的角色。
除了关于chr 11的weaseling之外,几乎但不太喜欢说它匹配任何既不是\p{Alphabetic}
也不\p{Digit}
,也不是下划线(LOW LINE)和\p{WhiteSpace}
的东西。选项卡,因为不被视为\s
,但 被视为\p{WhiteSpace}
。
小\s
简写真的是menas \p{PerlSpace}
,不是 \p{WhiteSpace}
。 \p{Space}
与\p{WhiteSpace}
相同。唯一的\S
字符(也就是\s
)也是\p{Space}
,这是一个讨厌的垂直制表符。请注意,\v
中包含垂直标签,因此对于任何垂直或水平空白区域,[\v\h]
均与\p{Space}
相同,而不是\s
。
我现在要更准确地了解字母数字。为简单起见,我将谈谈积极的比赛。反转逻辑以获得负匹配应该很容易。
如果用“字母数字”表示字母或数字,则应该使用恰恰相反的属性。 \pL
是\p{Letter}
的缩写,可能涵盖了这些内容。所有字母都是字母,但是字符,\p{Alphabetic}
但不是\p{Letter}
,如罗马数字,带圆圈的字母和各种变音符号。
对于数字,问题是您是否仅包含数字,或者其他数字是否正常。 \pN
是\p{Number}
的缩写,但包含许多非数字。 \d
是\p{Nd}
的缩写,\p{Decimal_Number}
的缩写只是\p{Digit}
的缩写,尽管\p{POSIX_Digit}
也可以。不是数字的数字包括罗马数字,粗俗分数,上标数字和带圆圈的数字。
在Perl 5.11之后的某个时间开始,您可以使用[0-9]
之类的属性,只有\p{POSIX_Alpha}
,\p{POSIX_Alnum}
仅用于字母,\p{POSIX_Space}
用于两者。还有/(?=\p{ASCII})[\p{Alpha}\p{Digit}]/
个版本或更好版本,涵盖9-13个字符加上仅,完全忽略了后来出现的其他20个空格字符。
在此之前,您仍然可以使用先行断言将匹配限制为ASCII范围,该先行断言仅使用/[\p{Letter}\p{Digit}]/
将匹配限制为ASCII,尽管将字符限制为7位非常可追溯到千禧年。 / p>
我可能会让他们使用罗马数字而不是异国情调,所以只使用/[\pL\d]/
,如果您愿意,可以缩短\s
。
现在,您为\p{Space}
或稍宽/[\p{Letter}\p{Digit}\p{Space}]/
的空格添加空格,即可获得!
。我也会把它留在那种形式,因为我认为你的意思更清楚。
为了否定这一点,您可能会认为它以/[^\p{Letter}\p{Digit}\p{Space}]/
作为前缀,但由于空字符串匹配,因此不完全相同。因此,您应该在角色类的开头添加一个插入符号来补充该集合,使其成为\p
。
你可以不只是将\P
转换为/[\P{Letter}\P{Digit}\P{Space}]/
而不是单一属性的方式,因为/i
会得到字母字符是非数字,(白色)空格字符是非数字,数字字符是非空格,等等。
但仍然没有理由使用{{1}}。
答案 2 :(得分:2)
[^\p{Alnum}\d ] # NOT alnum or space