在 Google 表单中的段落问题中,以下设置用于停止输入表情符号、破折号(十六进制字符 97)和 €(十六进制字符 80): 正则表达式匹配 ^[\x0A-\xFF]*$
在移动设备(非桌面设备)上的 Chrome 浏览器中,此正则表达式限制输入:
如何更新正则表达式^[\x0A-\xFF]*$以启用上述 6 项?
我尝试在正则表达式中输入不同的公式,例如 ^([^\p{Emoji}]|\[^p{Emoji}])*$ 但这没有帮助,它使情况变得更糟.
您在字符的数字表示中混淆了 Windows Latin-1 和 Unicode 字符集,这就是您的正则表达式未返回预期结果的原因。我纠正了这个问题,并从类中删除了一些不相关的字符,以获得在 Google 表单中使用的正则表达式:
^[\x0A\x0D\x20-\x7E\xA0-\xFF\x{2018}\x{2019}\x{201C}\x{201D}]*$
。
在下文中,我使用
255
表示十进制表示法,使用 \xFF
表示十六进制表示法。
问题在于,当 Google Forms 中实现的 Google RE2 正则表达式库使用其 Unicode 来指定字符时,您正在使用 Windows Latin-1 (CP1252) 字符集中的数字表示来指定字符代码点(可能像大多数(如果不是全部)现代正则表达式引擎)。
对于前 256 个位置(
\x00
到 \xFF
),两个集合中的字符是相同的,因此允许混淆,因为 RE2 表达式 ^[\x0A-\xFF]*$
匹配相同的字符,即:
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
N.B.:上面的空白对应于不可打印的字符。
但是要构建 RE2 兼容的正则表达式(其字符位置高于
\xFF
),您必须使用 Unicode 值(“代码点”)。
让我们比较一下您问题中考虑的字符的数字表示:
性格 | 描述 | 在 Windows Latin-1 字符集中的位置 |
在 Unicode 字符集中的位置 | 正则 表达式 |
---|---|---|---|---|
"
| 34 或 \x22
| 34 或 \x22
| ||
'
| 39 或 \x27
| 39 或 \x27
| ||
‘
| 145 或 \x91
| 8216 或 \x2018
| ||
’
| 146 或 \x92
| 8217 或 \x2019
| ||
“
| 147 或 \x93
| 8220 或 \x201C
| ||
”
| 148 或 \x94
| 8221 或 \x201D
| ||
—
| 151 或 \x97
| 8212 或 \x2014
| ||
€
| 128 或 \x80
| 8364 或 \x20AC
| ||
😀
| 不包括 | 128512 或 \x1F600
| ||
其他表情符号 | 不包括 | ... 或 \x...
|
^[\x0A-\xFF]*$
将匹配较低位置的字符,但不匹配 Unicode 中位于高位置(远高于
\xFF
)的左/右引号。因此,您需要使用这些特定标记的表示来扩展字符类,如下所示:
^[\x0A-\xFF\x{2018}\x{2019}\x{201C}\x{201D}]*$
。RE2 需要大括号来表示由三位或更多数字组成的十六进制数字。
\x0A
和
\x1F
之间的所有控制字符(只有
\x0A
和
\x0D
似乎与我相关)。此外,位置
\x7F
到
\x9F
被分配给在您的情况下不输入的控制(因此不可打印)字符。因此,更相关但更长的表达方式是
^[\x0A\x0D\x20-\x7E\xA0-\xFF\x{2018}\x{2019}\x{201C}\x{201D}]*$
。你可以测试一下那里。 顺便说一下,这些表达式不包括欧元符号、破折号和表情符号。
我无法重现这些正则表达式无法匹配字符 \x22
和
\x27
。另请注意,Google RE2 库不支持
\p{Emoji}
字符类。