2

我利用这个软件 dk-brics-automaton 来获取正则表达式的状态数。现在,例如我有这种类型的 RE:

  ^SEARCH\s+[^\n]{10}

当我将它作为字符串插入下面时,编译器会说无效的转义序列

  RegExp r = new RegExp("^SEARCH\s+[^\n]{10}", ALL);

其中 ALL 是某个 FLAG

当我在小 s 之前使用双反斜杠时,编译器将其作为字符串接受,这里的 \s 表示空格,但是当我将使用双反斜杠时我很困惑,然后它会考虑只考虑反斜杠和“s”我的意思是空白。

现在,我有数千个这样的正则表达式,我想为其计算有限自动机状态。那么,这是否意味着我必须在所有 RE 中手动添加反斜杠?

这是一个链接,他们在其中解释了与此相关的内容,但我不明白:

http://www.brics.dk/automaton/doc/index.html

如果有人在此软件方面有一些过去的经验,或者您有任何解决此问题的想法,请帮助我。

4

1 回答 1

2

我又看了一遍那个文档。“自动机”是一个 java 包,因此我认为你必须像对待 java 正则表达式一样对待它们。因此,只需将正则表达式中的每个反斜杠加倍即可。

这里的问题是,Java 不知道“原始”字符串。所以你必须逃脱两个级别。评估转义序列的第一个级别是字符串级别。

该字符串不知道转义序列\s,即错误。\n很好,字符串对其进行评估并存储两个字符\(0x5C)和n(0x6E)字符0x0A

然后字符串被存储并交给正则表达式构造函数。这里发生下一轮转义序列评估。

因此,如果您想逃避正则表达式级别,则必须将反斜杠加倍。字符串级别将评估\\to \,因此正则表达式级别获得正确的转义序列。

于 2013-06-21T06:02:39.563 回答