首页 > 解决方案 > 正则表达式中的加减 (±) 符号

问题描述

我需要生成一个验证 UTC 偏移量的正则表达式模式。这些通常格式化为UTC+05:30UTC-01:00。匹配如下(允许空格)似乎很简单:

^UTC[ ]?[+\-±][ ]?[01][0-9]:[034][05]$

[注意:我根据@barman 的反馈更新了这个模式]

有一个写有密码的口袋UTC±00:00。然而,正负号是把事情扔掉。以 PHP 为例:

echo preg_match("/^±$/","±");
echo preg_match("/^[±]$/","±");
echo preg_match("/^[\±]$/","±");

将返回true第一场比赛,但false其他两场比赛。

所以我的问题是,±在正则表达式中是否需要特殊处理?我在文档中找不到对此符号的任何引用。谢谢。

标签: phpregexutc

解决方案


看起来@Barmar 可能解决了您遇到的第一个问题(匹配 UTC 字符串)。但是,要解释您所看到的内容:

preg_match("/^±$/","±"); // true
preg_match("/^[±]$/","±"); // false
preg_match("/^[\±]$/","±"); // false

±字符长两个字节,因此preg_match将其解释为两个字符。为了以您期望的方式进行匹配,您必须使用/u修饰符。这告诉preg_match将您的模式视为 utf-8,它将解释±为单个字符而不是两个字符。

preg_match("/^[±]$/u","±"); // true

并包含一个与您的 UTC 样本匹配的示例:

// with the /u modifier (works as expected)
preg_match("/^UTC[ ]?[+\-±][ ]?[01][0-9]:[034][05]$/u", "UTC±05:30"); // true

// without the /u modifier (does not match)
preg_match("/^UTC[ ]?[+\-±][ ]?[01][0-9]:[034][05]$/", "UTC±05:30"); // false

推荐阅读