【问题标题】:What does [^0-9]+$ mean (regular expression in FLEX)[^0-9]+$ 是什么意思(FLEX 中的正则表达式)
【发布时间】:2021-11-15 17:51:23
【问题描述】:

这是我所知道的:

  1. 括号内的^ 匹配不属于括号内的字符。
  2. + 匹配表达式左侧的一个或多个外观(在我的 ex. [^0-9] 中)。
  3. $ 如果我没记错的话,匹配以左边表达式结尾的表达式。

然后看起来这个表达式应该匹配至少有一个不是数字的字符并且以该表达式结尾的输入,例如它应该匹配: 1a, aaa, 2321a,1b1b

并且不应该匹配: 111, 432423,asd3213

但我不清楚运行这条规则它到底匹配什么。

这是我的完整代码:

%option noyywrap
%{
    #include<stdio.h>
%}

%%
[^0-9]+$ printf("not a number");
%%
int main()
{
    yylex();
    return 0;
}

我正在使用 flex。

输出示例(对不起链接,它不会让我上传照片):

[1] https://ibb.co/qp3hB0r - 不匹配但打印回来

[2] https://ibb.co/syZHjrw - 不匹配并吃掉它(如果我没有在代码中添加“.|\n”,为什么会发生这种情况?)

[3] https://ibb.co/s6S0tQh - 匹配并打印回来

[4] https://ibb.co/VmZW7KR - 与第三个相同

[5] https://ibb.co/2vPfWhc - 仅匹配 11(?) 并吃掉了 aa

我对它实际匹配的内容感到非常困惑,希望能得到帮助。

【问题讨论】:

  • "它不会让我上传照片" 看来您正在处理文本。如果可以将文本本身包含在问题中,为什么还要包含文本图片? SO 强烈建议不要使用文字图片。只需将格式化文本复制并粘贴到您的问题中即可。
  • 您可能想从阅读 flex 手册中的几页开始:Pattern SyntaxHow the Input is Matched。第二个特别重要,因为它解释了 flex 扫描器的实际作用(将输入拆分为连续的标记,这与搜索正则表达式不同),以及当没有模式匹配时它会做什么。看完之后,如果还有不明白的地方,请随时提出更准确的问题。

标签: c regex flex-lexer lex lexical-analysis


【解决方案1】:

这是我所知道的:

  1. 括号内的^ 匹配不属于括号内的字符。

这是一种奇怪的说法。更准确的说法是,整个括号括起来的片段匹配 not 的一个字符(因为 ^)在 '0' - '9' 范围内。

  1. + 匹配表达式左侧的一个或多个外观(在我的 ex. [^0-9] 中)。

又是一种奇怪的说法。 + 量词修改前面的片段,以匹配它原本会匹配一次的任何内容的一个或多个外观。

  1. $ 如果我没记错的话,匹配以左边表达式结尾的表达式。

你错了。 $ anchors 匹配行尾——整个模式只匹配行尾的文本,由紧接在换行符之前的文本(因此 不是在文件的最后)。这是一个限制,而不是扩展:除了$ 之外,没有任何匹配的模式不匹配,但是还有一个额外的要求是匹配出现在行尾。这与匹配以匹配模式前面部分结尾的文本完全不同。

因此,

看来这个表达式应该匹配至少有一个的输入 不是数字且以该表达式结尾的字符,例如 应该匹配的例子:1a, aaa, 2321a,1b1b

没有。以这四个单独的例子为例,除非它们出现在一行的末尾,否则它不会匹配任何一个。如果它们都出现在一行的末尾,那么总共只会匹配aaa,但会匹配其他每个的尾随ab

然而,请注意,当 flex 扫描器无法将输入与任何用户定义的规则匹配时,会调用其默认规则,将下一个输入字符复制到标准输出,并使用它。因此,如果您向扫描仪提供一个输入,该输入在一行的末尾至少包含一个非数字,那么它最终将消耗之前的任何输入,直到最后一个数字,在标准输出上打印所有这些,然后最终匹配该行的尾随部分并打印“不是数字”。

【讨论】:

  • 在 (f)lex 中,模式末尾的 $ 与 (f)lex 尾随上下文运算符子模式 /\n 完全相同。与许多正则表达式库不同,$ 在输入末尾不匹配;它仅在至少有一个后续字符时才匹配,该字符必须恰好是换行符(而不是,例如 \r\n)。所以说它匹配“在一行的末尾”可能会有点误导。虽然文本文件 * 应该以换行符结尾,而且大多数都是这样,但 (f)lex 也用于扫描在内存中构造的字符串,并且在末尾不添加换行符是很常见的。这可以创造惊喜。
  • 谢谢@rici,我已经阐明了“在行尾”的含义。
猜你喜欢
  • 1970-01-01
  • 2014-04-06
  • 2011-06-15
  • 2012-06-10
  • 1970-01-01
  • 2012-09-07
  • 2011-08-28
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多