Regex 正则表达式-奇怪的行为

Regex 正则表达式-奇怪的行为,regex,compiler-construction,Regex,Compiler Construction,我正在写一个编译器。我刚刚开始,所以我正在创建扫描仪(或Lexer)。目前,我正在编写一些常规定义,这些定义将由我的扫描仪处理。试图创建其中一个,我遇到了下一个问题: 我当时正在测试以下(非常简单的)正则表达式: r = /(a|ab)/ 其中“r”是一个常规定义;我的意思是,正则表达式就是(a | ab) 我认为L(r)的语言应该是(根据书中的描述): 令人惊讶的是,该工具与{a}匹配 所以我的问题是,为什么会有这种行为?正则表达式从左到右解析文本,如果是交流发电机(|),它将首先与第一个候

我正在写一个编译器。我刚刚开始,所以我正在创建扫描仪(或Lexer)。目前,我正在编写一些常规定义,这些定义将由我的扫描仪处理。试图创建其中一个,我遇到了下一个问题:

我当时正在测试以下(非常简单的)正则表达式:

r = /(a|ab)/
其中“r”是一个常规定义;我的意思是,正则表达式就是
(a | ab)

我认为L(r)的语言应该是(根据书中的描述):

令人惊讶的是,该工具与
{a}
匹配


所以我的问题是,为什么会有这种行为?

正则表达式从左到右解析文本,如果是交流发电机(
|
),它将首先与第一个候选者匹配

如果您使用:

(ab|a)
它将同时匹配
ab
a

关键是一旦找到匹配,全局匹配器将在第一次匹配结束后开始下一次匹配尝试

您可以轻松地验证匹配的语言是否为
{a,ab}
:使用正则表达式
^c(a | ab)d
cabd
。在这种情况下,regex别无选择,只能选择第二个选项

假设正则表达式是:
(a | ab)
,文本是
ab
。它将与
a
匹配,接下来它将在
a
之后启动,因此它将尝试与
b
匹配,但失败

然而,大多数lexer工具使用不同的方法来确定匹配。对于lexer工具,“最长匹配”计算在内。因此,匹配的字符数最长


现在,如果您以regex的形式输入
(a | ba)
,它将与前面的
ba
匹配。为什么?因为它也旨在找到第一次尝试。在文本
cbad
中,从索引
1开始(
b
)被认为比从索引
2开始(
a
)更好。

正则表达式从左到右解析文本,如果是交流发电机(
),它将首先与第一个候选者匹配

如果您使用:

(ab|a)
它将同时匹配
ab
a

关键是一旦找到匹配,全局匹配器将在第一次匹配结束后开始下一次匹配尝试

您可以轻松地验证匹配的语言是否为
{a,ab}
:使用正则表达式
^c(a | ab)d
cabd
。在这种情况下,regex别无选择,只能选择第二个选项

假设正则表达式是:
(a | ab)
,文本是
ab
。它将与
a
匹配,接下来它将在
a
之后启动,因此它将尝试与
b
匹配,但失败

然而,大多数lexer工具使用不同的方法来确定匹配。对于lexer工具,“最长匹配”计算在内。因此,匹配的字符数最长


现在,如果您以regex的形式输入
(a | ba)
,它将与前面的
ba
匹配。为什么?因为它也旨在找到第一次尝试。在文本
cbad
中,从索引
1开始(
b
)被认为比从索引
2开始(
a
)更好。

正则表达式从左到右解析文本,如果是交流发电机(
),它将首先与第一个候选者匹配

如果您使用:

(ab|a)
它将同时匹配
ab
a

关键是一旦找到匹配,全局匹配器将在第一次匹配结束后开始下一次匹配尝试

您可以轻松地验证匹配的语言是否为
{a,ab}
:使用正则表达式
^c(a | ab)d
cabd
。在这种情况下,regex别无选择,只能选择第二个选项

假设正则表达式是:
(a | ab)
,文本是
ab
。它将与
a
匹配,接下来它将在
a
之后启动,因此它将尝试与
b
匹配,但失败

然而,大多数lexer工具使用不同的方法来确定匹配。对于lexer工具,“最长匹配”计算在内。因此,匹配的字符数最长


现在,如果您以regex的形式输入
(a | ba)
,它将与前面的
ba
匹配。为什么?因为它也旨在找到第一次尝试。在文本
cbad
中,从索引
1开始(
b
)被认为比从索引
2开始(
a
)更好。

正则表达式从左到右解析文本,如果是交流发电机(
),它将首先与第一个候选者匹配

如果您使用:

(ab|a)
它将同时匹配
ab
a

关键是一旦找到匹配,全局匹配器将在第一次匹配结束后开始下一次匹配尝试

您可以轻松地验证匹配的语言是否为
{a,ab}
:使用正则表达式
^c(a | ab)d
cabd
。在这种情况下,regex别无选择,只能选择第二个选项

假设正则表达式是:
(a | ab)
,文本是
ab
。它将与
a
匹配,接下来它将在
a
之后启动,因此它将尝试与
b
匹配,但失败

然而,大多数lexer工具使用不同的方法来确定匹配。对于lexer工具,“最长匹配”计算在内。因此,匹配的字符数最长


现在,如果您以regex的形式输入
(a | ba)
,它将与前面的
ba
匹配。为什么?因为它也旨在找到第一次尝试。在文本<代码> cBad 中,从索引<代码> 1 (<代码> B<代码> >开始,比开始在索引<代码> 2代码>(<代码> A<代码> >)好。

< P> ReXEX <代码> AB Ab/COD>匹配“A”或“AB”(很明显),但一些工具/语言(如java)考虑匹配时的输入。