如何创建与空格以外的非字母数字字符匹配的Perl正则表达式?

Joe*_*moe 2 regex unicode perl non-alphanumeric character-properties

我有一个Perl正则表达式/\W/i匹配所有非字母数字字符,但它也匹配我想忽略的空格.如何使其与空格以外的非字母数字字符匹配?

ste*_*nar 14

你可以用

/[^\w\s]/
Run Code Online (Sandbox Code Playgroud)

这匹配所有非单词字符(\ w)和非空格字符(\ s).

编辑:

/[^\w ]/
Run Code Online (Sandbox Code Playgroud)

如果你只想忽略空格(不是所有的空格).

更新:

删除,i因为它不需要(见几条评论).

  • 请注意,这与非WORD字符匹配,但Joe说他想匹配非ALPHANUMERIC字符.`\ w`包括(和`\ W`排除)至少一个非字母数字,`_`.您可能希望使用`/ [^ a-z0-9\s]/i`来排除字母数字.假设你不关心重音字符等,这会打开另外一堆蠕虫. (4认同)
  • 你不需要`/ i`修饰符 - `/ w`已经不区分大小写. (2认同)

tch*_*ist 8

对于大多数目的,[^\w\s]应该足够了.这只匹配一个既不是"alphanum"也不是PerlSpace的角色.

这几乎是,但不是很喜欢称它匹配任何东西既不是\p{Alphabetic}也不是\p{Digit},也不是下划线(LOW LINE),也没有\p{WhiteSpace},除了关于CHR 11,垂直选项卡中的weaseling,因为这是考虑的\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}

一段时间的Perl 5.11后开始,您可以使用属性像\p{POSIX_Digit}什么也不要[0-9],\p{POSIX_Alpha}只字母,和\p{POSIX_Alnum}两个.还有一个\p{POSIX_Space}版本或更好的版本,涵盖9-13加上32个字符,完全忽略了后来出现的其他20个空格字符.

在此之前,您仍然可以通过使用前瞻断言将匹配限制为ASCII范围,该先行断言将匹配限制为仅使用ASCII /(?=\p{ASCII})[\p{Alpha}\p{Digit}]/,尽管将字符限制为7位非常可追溯到千禧年.

我可能会让他们使用罗马数字而不是外来的变音符号,所以只需使用/[\p{Letter}\p{Digit}]/,/[\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}]/会得到字母字符都是非数字,(白)空格字符都是非数字,数字字符是nonspaces等.

但是仍然没有理由使用/i.