我需要从字符串中提取表达式。
输入字符串
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/