TRegExpr为什么(。* $)表达式在字符串上工作两次?

时间:2012-10-01 12:39:29

标签: regex delphi

我正在使用TRegExpr解析字符串。表达式如下:

(.*$)

这意味着它应该找到整个字符串,但在我使用命令ExecNext找到它之后,它会找到空字符串,但由于$符号,该行已经结束了。

有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:2)

默认情况下,正则表达式.(一个点)与换行符不匹配。如果你输入了换行符,你会看到这种行为。

试试这个:

(?s)(.*$)

表达式(?s)为正则表达式的其余部分打开“点匹配换行符”。

答案 1 :(得分:2)

这是因为*量词。它将匹配之前出现的0个或多个字符。 0出现意味着它将匹配空字符串。

$anchor,零宽度断言。它与字符串的结尾不匹配,它匹配字符串结尾之前的位置(或者作为字符串中最后一个字符的换行符之前)。

那会发生什么?

  1. 你的正则表达式首先匹配字符串直到字符串结尾。

  2. 正则表达式引擎的位置在最后一个字符之后,但在字符串结束之前。当你现在调用ExecNext时,它匹配字符串结尾之前的空字符串。

  3. 如果你想避免这种情况,请使用+量词,它至少需要一个匹配的字符==> .+$只能找到一个匹配。