我想通过这里定义的正则表达式来定义一个表名,这样:
名称总是以字母、下划线(_(或反斜杠((。使用字母、数字、句点和下划线名称其余部分的字符。
例外:您不能使用"C"c"R〃;,或";r〃;因为它们已被指定为选择列或当您在"名称"或"转到"框中输入它们时,活动单元格的行。
let lex_valid_characters_0 = ['a'-'z' 'A'-'Z' '_' 'x5C'] ['a'-'z' 'A'-'Z' '0'-'9' '.' '_']+
let haha = ['C' 'c' 'R' 'r']
let lex_table_name = lex_valid_characters_0 # haha
但它会返回一个错误character 0: character set expected.
。有人能帮忙吗?
以下是手册中对#
的描述:
regexp1#regexp2
(字符集的差异(正则表达式regexp1和regexp2必须是用[…](或单个字符表达式或下划线_(定义的字符集。匹配两个指定字符集的差异。
描述说这两个集合必须是用[ ... ]
定义的字符集,但您对lex_valid_characters_0
的定义远比这复杂。
#
的思想是,它定义了一个模式,该模式与指定为两个一个字符模式之差的集合中的一个字符完全匹配。因此,将其应用于匹配任意长度字符串的lex_valid_characters_0
是没有意义的。
更新
这是我对这个问题的思考,它的价值是什么。对于长度为2个或更多字符的名称没有额外的限制(正如我阅读规范所示(。因此,为这些名称指定正则表达式应该不会太困难。而且,要想出一个定义所有有效的1个字符名称的正则表达式也不难。完整的名称集合是这两个集合的并集。
您还可以使用这样一个事实,即最长的第一个匹配是适用于ocamllex的匹配。也就是说,在一般规则之前,你可以有4种特殊情况的规则。