正则表达式中的加减号 (±)

plus-minus (±) sign in regex

我需要生成一个正则表达式模式来验证 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("/^[\±]$/","±");

第一场比赛将 return true,另外两场比赛将 false

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

您不能将 - 放在 [] 内的两个字符之间,这样会创建一个范围(就像您写 [0-9] 时一样)而不是匹配 -字面意思。

你应该把-放在开头或结尾,或者转义它。

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

此外,您不要将 | 放在 [] 字符集中。在 () 中使用它来创建替代模式。

看起来@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