我有一个散列,其中包含一些数学表达式,它看起来像这样:
my %testhash = ("ABC" => "0.05 + 1 + foo",
"DEF" => "2E+5 -3",
"GHJ" => "2E+5 -3 * bar);
在我的代码中,我想评估每个 %testhash
值,但只有有效值 (在这个例子中只有 "DEF"
因为 foo
和 bar
未定义)。
因此,我需要确定哪些 keys %testhash
包含 [a-zA-Z]
,指数符号除外。
有没有一种方法可以使用优雅的单个正则表达式行来检查这一点,而不必剪切每个值并单独分析?
提前致谢! 亚历克斯
编辑:就像新手经常发布问题但没有提供必要的示例数据(对此很抱歉),所以我将更新哈希:
my %testhash = ("invalid1" => "0.05 + 1 + foo",
"invalid2" => "2E+5 -3 * bar",
"valid1" => "1.0e-03 + ( 42)",
"valid2" => "((3.0) / 3) * 5",
"valid3" => "2E+5 + 1");
最佳答案
表达式有效如果
- 除“E”外,其字符均为字母,
- 每个“E”前面都有一个数字,并且
- 每个“E”后跟一个符号和一个数字。
因此[1],表达式无效,如果
- 其中一个字符是“E”以外的字母,
- 前面没有数字的“E”,或者
- 有一个“E”,后面没有符号和数字。
这给了我们以下信息:
/ [A-DF-Z] | (?<![0-9])E | E(?![+-][0-9]) /ix
记住,
- “A 和B”的否定是“(非A)或(非B) ",
- “所有都是A”的否定是“至少一个不是A”,并且
- “没有一个是A”的否定是“至少有一个是A”。
关于regex - Perl:如何检查数学表达式是否包含字母数字部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36303916/