如何在 Google 表单中段落问题的正则表达式中启用单引号、双引号和标记?

问题描述 投票:0回答:1

在 Google 表单中的段落问题中,以下设置用于停止输入表情符号、破折号(十六进制字符 97)和 €(十六进制字符 80): 正则表达式匹配 ^[\x0A-\xFF]*$

IMAGE of Google Forms input: Regular Expression Matches ^[\x0A-\xFF]*$

在移动设备(非桌面设备)上的 Chrome 浏览器中,此正则表达式限制输入:

  1. 双引号(十六进制字符 22)
  2. 单引号(十六进制字符 27)
  3. 左单引号(十六进制字符 91)
  4. 右单引号(十六进制字符 92)
  5. 左双引号(十六进制字符 93)
  6. 右双引号(十六进制字符 94)
  • 尽管公式 ^[\x0A-\xFF]*$ 包括十六进制字符 10 (0A) 到十六进制字符 255 (FF)。

如何更新正则表达式^[\x0A-\xFF]*$以启用上述 6 项?

我尝试在正则表达式中输入不同的公式,例如 ^([^\p{Emoji}]|\[^p{Emoji}])*$ 但这没有帮助,它使情况变得更糟.

regex google-forms double-quotes single-quotes
1个回答
0
投票

TL;博士

您在字符的数字表示中混淆了 Windows Latin-1Unicode 字符集,这就是您的正则表达式未返回预期结果的原因。我纠正了这个问题,并从类中删除了一些不相关的字符,以获得在 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 值(“代码点”)。

让我们比较一下您问题中考虑的字符的数字表示:

必须匹配引号(或双引号)是的撇号(或单引号)是的左单引号是的右单引号是的左双引号是的右双引号是的Em破折号不欧元符号不笑脸不不
性格 描述
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}
 字符类。

© www.soinside.com 2019 - 2024. All rights reserved.