【问题标题】:A regex for extracting " ; " or "=" symbols from source code?用于从源代码中提取“;”或“=”符号的正则表达式?
【发布时间】:2016-03-29 17:15:21
【问题描述】:

例如

int val = 13;

Serial.begin(9600);

val = DigitalWrite(900,HIGH);

我真的很想提取像=;这样的特殊符号。

我已经能够提取出现在代码中相邻的符号,但我需要所有出现。

我试过[^ "//"A-Za-z\t\n0-9]*[\;\=\{\}\,]+。都没有用。

怎么了?


我为我的扫描仪制定了如下规则。(已更改)

分号[;]([\n]|[^ "//"])

赋值 (.)?[=]+

大括号 ([{]|[}])([\n]|[^ "//"])

圆括号(“()”)“”

问题是这样发生的

  1. int val=13; // 它无法识别“=”,因为“val”和“=”是相邻的。我想认出它们是否相邻

  2. serial.read(); // 它无法识别 () 和 ;与单独。如果我添加分号规则和圆括号规则,();被认出来了。

我该如何解决?

【问题讨论】:

  • 如果要识别单个字符,请不要使用重复运算符(*+)。只需[...] 将匹配一个字符。此外,您不需要在字符类中对字符进行反斜杠转义,反斜杠除外。所以[;={},] 可以匹配其中一个字符(正如我所说,[;={},]+ 将匹配任意数量的此类字符,因此它将匹配字符串 }; 作为单个标记。
  • 我试过 [;={}] 但有一个警告。 - 找不到正确的匹配我一直在努力划分令牌。例如 int val = 13;案例是成功 int val= 13;案子不成功我怎么能分他们?
  • 我认为您需要更多地展示您的扫描仪定义,并更清楚地描述您的要求。
  • 我编辑了我的问题。请检查一下 !我真的很想知道我错过了什么。
  • @WonHeeLee 一旦你的问题得到回答,请不要破坏你自己的问题。问题应该是为了后代,并帮助未来的读者。

标签: regex flex-lexer lex


【解决方案1】:

你想打破“DigitalWrite(900,HIGH);”进入“DigitalWrite”“(”“900”“”“HIGH”“)”“;”。我认为循环每个子字符串是最快的方法。

        string text = "val = DigitalWrite(900,HIGH);";
        string[] symbols = new string[] { "(", ")", ",", "=", ";"};
        List<string> tokens = new List<string>();
        string word = "";
        for( int i = 0; i < text.Length; i++ )
        {
            string letter = text.Substring( i, 1 );
            if( !letter.Equals( " " ) )
            {
                if( tokens.Contains( letter ) )
                {
                    if( word.Length > 0 )
                    {
                        tokens.Add( word );
                        word = "";
                    }
                    tokens.Add( letter );
                }
                else
                {
                    word += letter;
                    if(i == text.Length - 1 )
                        tokens.Add( word );
                }
            }
        }

【讨论】:

  • 非常感谢。但是有什么方法可以通过正则表达式来划分?
【解决方案2】:

所以搜索“;”而“=”是你想要达到的最终目标吗? 在这种情况下,你为什么不直接使用.find() 之类的函数呢? 或者,您可以用“;”分割字符串首先搜索“=”。

如果您想抓取“=”和“;”之间的文本,请尝试使用=([^;]*);=(.*?);

【讨论】:

  • 您建议的第二种方法不起作用..最终目标是提取特殊符号。 val = DigitalWrite(900,HIGH);在这里,我想划分);到 ) 和 ;这是最终目标。或任何其他特殊符号!
  • 你的意思是拆分 DigitalWrite(900,HIGH);变成“DigitalWrite”“(”“900”“”“HIGH”“)”“;”?给我们更多细节。
  • 是的,没错!或 DigitalWrite(900,HIGH);进入“DigitaWrite”“;”但我想把你说的分开,我的意思更详细。我试图从源代码中识别标识符、数字、特殊符号、注释!
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2019-11-11
  • 2014-01-27
相关资源
最近更新 更多