字符0:预期字符集

问题描述

我想通过正则表达式here来定义表名:

始终以字母,下划线字符(_)或 反斜杠()。使用字母,数字,句号和下划线 名称的其余字符。

例外:名称不能使用“ 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种特殊情况的规则。