构造物 \H、\V 和 \N 代表什么意思?

17

以下结构没有很好的文档说明,但在特定版本的PHP中确实可以工作;这些版本是哪些,这些结构是什么,还有哪些实现支持它们?

  • \H
  • \V
  • \N

本帖子是Stack Overflow正则表达式参考资料的一部分。

1个回答

24

\H 匹配除水平空格以外的任何字符。包括制表符和所有“空格分隔符”Unicode字符。这与以下内容相同:

[^\h] or
[^\t\p{Zs}]

\V\v 的取反类 - 它被命名为“非垂直空白字符”,匹配任何不是 Unicode 标准中作为换行符号并通过 \v 匹配的垂直空白字符的字符,并且与 Perl 5 中引入的以下内容相同:

[^\v] or
[^\n\cK\f\r\x85\x{2028}\x{2029}]

\N 匹配除了换行符 \n 以外的任何字符。很简单!

[^\n]

什么是\V+\N+的区别?感谢Avinash Raj的提问。

根据Perl 5.10中的文档,\V[^\n\cK\f\r\x85\x{2028}\x{2029}]相同,不应匹配任何\n\r\f,以及Ctrl+(Control char) (*nix)、0x850x20280x2029

这些字符类对于想要匹配水平文本内的所有内容-\V+,或者仅仅消耗整个段落-\N+-以及其他各种用例非常方便且非常有效。


以下实现支持\H\V\N


4
Perl 5.10和PCRE 7.2于2007年6月发布,并带有这个“新功能”。PHP在2007年11月作为默认支持实现了PCRE 7.2。Java 8则于2013年才将其作为“新功能”发布! - Unihedron
我相信在Perl 5.10中,\N结构被称为Unicode字符。因此错误是\N <-- 缺少命名的Unicode字符,其格式为\N{..} - user557597
我说的是Perl 5.10。它实际抛出的错误是Missing braces on \N{} in regex; marked by <-- HERE in m/\N <-- HERE,其中正则表达式为/\N+/,如果它自己使用应该只匹配N,如果它在结构上有重复,并且量词不重要。 - user557597
@sln 谢谢,已验证,我很快会更新参考文献和本帖子以反映这一点。真不敢相信我竟然在测试中忘记了Perl。感谢你指出来!看起来这种行为是依赖于pcre的。 - Unihedron
您提供的perlre文档链接是针对Perl 5.20.1中最新的正则表达式。我不知道他们何时改用\N(?:{..})?`,但这并不是在5.10版本中进行的更改。在5.10-5.20之间是一个过渡阶段,之后是6.0版本,而且不稳定。他们永远无法做到完美,因为6.0版本的目标几乎是无法实现的。在我看来,5.10版本是最后一个稳定版本,因为他们试图挤出可用的最后一滴构造。这真是一个悲哀的状态。 - user557597
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接