regex - Perl:如何检查数学表达式是否包含字母数字部分

标签 regex perl

我有一个散列,其中包含一些数学表达式,它看起来像这样:

    my %testhash = ("ABC" => "0.05 + 1 + foo",
                    "DEF" => "2E+5 -3",
                    "GHJ" => "2E+5 -3 * bar);

在我的代码中,我想评估每个 %testhash 值,但只有有效值 (在这个例子中只有 "DEF" 因为 foobar 未定义)

因此,我需要确定哪些 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

  1. 记住,

    • AB”的否定是“(非A)或(非B) ",
    • “所有都是A”的否定是“至少一个不是A”,并且
    • “没有一个是A”的否定是“至少有一个是A”。

关于regex - Perl:如何检查数学表达式是否包含字母数字部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36303916/

相关文章:

python - 如何使用正则表达式来匹配文件中其他小写单词不连续重复的大写单词

javascript - 如何替换\r\n

java - 捕获可以匹配多种模式的字符串

regex - Perl 任意位置的可选组

javascript - JS : matching entries with capture groups, 占新行

regex - 删除连续的数学运算符,在字符串的开头和结尾

perl - perl 中大写 "-E"开关和小写 "-e"有什么区别?

perl - 将中间元素插入数组

perl - 我如何进行模式匹配并继续写入新文件直到另一个模式匹配

oop - 什么是间接对象表示法,为什么不好,如何避免呢?