【问题标题】:Is \p{L} equivalent to [^\d\s]\p{L} 是否等价于 [^\d\s]
【发布时间】:2020-06-21 12:02:15
【问题描述】:

为了匹配字母,这两个正则表达式是等价的吗?一个通常更可取吗?或者这是“视情况而定”的情况?

1.Unicode字母短代码:

\p{L}

2.否定PCRE数字和空格的短代码:

[^\d\s]

【问题讨论】:

    标签: regex pcre


    【解决方案1】:

    它们不相等。

    假设您使用u 选项,\p{L} 表示“字母(L 类)”。 [^\s\d] 表示“不是空格(类别 Z),也不是数字(类别 Nd)”。 如果每个角色确实属于这三个类别之一,那么由于集合论,您是对的,但是有些角色不属于这三个类别中的任何一个类别。

    例如,逗号, 是一个标点符号(P 类),将与[^\s\d] 匹配,而不是\p{L}

    In fact, there are a lot more than 3 categories in Unicode.

    所以要实际使用否定来表示\p{L},你必须说:

    [^\p{C}\p{M}\p{N}\p{P}\p{S}\p{Z}]
    

    基本上列出所有其他类别。但是一旦 Unicode 决定添加一个新类别并且 PCRE 决定支持它,它就会中断。不用说,请不要在生产中使用它:)

    【讨论】:

      【解决方案2】:

      两个正则表达式之间的对比是鲜明的:

      正则表达式\p{L} 匹配任何字母(因此是L),不仅像\w 那样匹配罗马和希腊字母,还匹配任何其他字母。

      否定字符类[^\d\s] 匹配任何不是数字0-9 并且不是制表符、换行符、垂直制表符、换页符、回车符、空格和其他可能与语言环境相关的内容字符。

      因此,[^\d\s] 比仅匹配一种字符类型的 \p{L} 更强大,匹配范围更广的字符类型。

      【讨论】:

      • 干杯克里斯 - “强大”真的可以是任何一个角度 - 也许 \p{L} 的重点是权力?
      猜你喜欢
      • 2016-10-25
      • 2012-01-14
      • 1970-01-01
      • 2021-03-21
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多