0

我想通过这里定义的正则表达式来定义一个表名,这样:

始终以字母、下划线字符 (_) 或反斜杠 () 开头的名称。在名称的其余部分使用字母、数字、句点和下划线字符。

例外:您不能使用“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.。有人可以帮忙吗?

4

1 回答 1

1

以下是 #手册中的描述:

正则表达式 1 #正则表达式 2

(字符集的区别) 正则表达式 regexp1 和 regexp2 必须是用 [... ] 定义的字符集(或单个字符表达式或下划线 _)。匹配两个指定字符集的差异。

描述说这两个集合必须是定义的字符集,[ ... ]但您的定义lex_valid_characters_0远比这复杂得多。

的想法#是,它定义了一个模式,该模式与指定为两个单字符模式的差异的集合中的一个字符完全匹配。lex_valid_characters_0所以将它应用于匹配任意长度的字符串是没有意义的。

更新

这是我对这个问题的看法,因为它的价值。长度为 2 个或更多字符的名称没有额外的限制(正如我阅读规范)。因此,为这些名称指定正则表达式应该不会太难。而且,想出一个定义所有有效的 1 字符名称的正则表达式也不难。完整的名称集是这两个集合的并集。

您还可以使用最长的第一个匹配项是适用于 ocamllex 的匹配项这一事实。即,您可以在一般规则之前为 4 种特殊情况制定规则。

于 2020-08-12T02:09:20.350 回答