c++ - 从字符串中提取数学表达式 C++ PCRE

标签 c++ regex

我需要从字符串中提取表达式。

输入字符串

N100$VAR1=100+$Var2*30 + #29X=30.99Z=(#991+ ( 30*SIN(60) + $VAR32 ) / #32)

预期输出

$VAR1=100+$Var2*30 + #29
X=30.99
Z=(#991+ ( 30*SIN(60) + $VAR32 ) / #32)

我尝试了以下

(\$*[A-Z][A-Z\d\_]+)\s*=\s*([\S]*)\s*([\+\-\/\*]\s*(\$*[A-Z0-9\.\_\)]+)\s*)

这在字符串中没有空格时有效 我希望它也适用于空白。

TIA。

最佳答案

您可以使用正则表达式来匹配直到 = 的变量, 然后是变量第一次出现之前的任何文本+ =图案:

(\$*[A-Z][A-Z\d_]*)\s*=\s*((?:(?![A-Z]\d+\.\d+|[A-Z][A-Z\d_]*\s*=).)*)

参见 regex demo

详细信息:

  • (\$*[A-Z][A-Z\d_]*) - 第 1 组:
    • \$* - 0+ $符号
    • [A-Z] - 一个大写的 ASCII 字母
    • [A-Z\d_]* - 0+ 大写 ASCII 字母、数字或 _
  • \s*=\s* - 一个 =用 0+ 个空格括起来
  • ((?:(?![A-Z]\d+\.\d+|[A-Z][A-Z\d_]*\s*=).)*) - 第 2 组:
    • (?:(?![A-Z]\d+\.\d+|[A-Z][A-Z\d_]*\s*=).)* - 0+序列:
      • (?![A-Z]\d+\.\d+) - 下一个字符不能是序列的起始字符:大写 ASCII 字母,1+ 位,.和 1+ 位数字
      • (?![A-Z][A-Z\d_]*\s*=) - 下一个字符不能是序列的起始字符:大写 ASCII 字母,0+ 大写 ASCII 字母/数字/_ , 0+ 空格, =
      • . - 除换行符以外的字符

参见 C++ demo :

#include <string>
#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::regex r(R"((\$*[A-Z][A-Z\d_]*)\s*=\s*((?:(?![A-Z]\d+\.\d+|[A-Z][A-Z\d_]*\s*=).)*))");
    std::string s = "N100$VAR1=100+$Var2*30 + #29X=30.99Z=(#991+ ( 30*SIN(60) + $VAR32 ) / #32)";
    for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
                             i != std::sregex_iterator();
                             ++i)
    {
        std::smatch m = *i;
        std::cout << "Match value: " << m.str()      << '\n';
        std::cout << "    Capture: " << m[1].str()   << '\n';
        std::cout << "    Capture: " << m[2].str()   << '\n';
    }
    return 0;
}

输出:

Match value: $VAR1=100+$Var2*30 + #29
    Capture: $VAR1
    Capture: 100+$Var2*30 + #29
Match value: X=30.99
    Capture: X
    Capture: 30.99
Match value: Z=(#991+ ( 30*SIN(60) + $VAR32 ) / #32)
    Capture: Z
    Capture: (#991+ ( 30*SIN(60) + $VAR32 ) / #32)

关于c++ - 从字符串中提取数学表达式 C++ PCRE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41186339/

相关文章:

python - 如何编写正则表达式以从 CSS 文件中提取特定的键格式和值?

javascript - 尝试从链接中删除字符串,但它不起作用

C++ 排序和跟踪索引

c++ - 商业游戏如何处理即时字体加载?

c++ - 如何在 Linux 中配置和设置谷歌测试框架

c++ - 如何在派生类中创建与基类同名的函数

C++ boost nuget 无法打开文件 Visual Studio 2015

php - 如何删除php中标签之间的文本?

javascript - 使用 JavaScript 检测文本中的 URL

c# - 在 C# 中使用正则表达式从完整路径解析文件名