正则表达式中的加减号 (±)
plus-minus (±) sign in regex
我需要生成一个正则表达式模式来验证 UTC 偏移量。它们的格式通常为 UTC+05:30
或 UTC-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
我需要生成一个正则表达式模式来验证 UTC 偏移量。它们的格式通常为 UTC+05:30
或 UTC-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