繁体   English   中英

手势捕获的异常:类型“_RegExpMatch”不是 Flutter/Dart 中类型转换中类型“double”的子类型

[英]Exception caught by gesture: type '_RegExpMatch' is not a subtype of type 'double' in type cast in Flutter/Dart

我试图用 Flutter 制作一个计算器来处理 Dart 的欧姆定律和幂律。 对于上下文,V 表示电压,I 表示安培数,R 表示电阻,P 表示电功率,而圆括号中的 O 和 P 表示该方程是否用于计算欧姆或功率定律。

if (expression.contains("(V)") &&
            expression.contains("(I)") &&
            ohm) {
          expression = equation.replaceAll("(I)", "/");
          expression = expression.replaceAll("(V)", "/");
          expression = expression.replaceFirst("/", "First");
          expression = expression.replaceAll("/", "Second");
          RegExp fir = RegExp("^[^F]*");
          RegExp sec = RegExp("(?<=t)(.*?)(?=S)");
          double pri = 0;
          double seg = 0;
          print(expression);
          print(fir);
          print(sec);
          pri = fir.firstMatch(expression) as double;
          //Exception triggers here
          print(pri);
          seg = sec.firstMatch(expression) as double;
          print(seg);
          if (seg > pri) {
            expression = expression.replaceFirst(fir, seg as String);
            expression = expression.replaceFirst(sec, pri as String);
          }
          expression = expression.replaceFirst("First", "/");
          expression = expression.replaceFirst("Second", "");
          print(expression);
        }

在上面的代码中,我正在尝试使用正则表达式检查第二个值是否大于第一个值,其中我使用替换更改双方的数字,因此在尝试时不会触发整个考验的错误做数学。 就像下面这个例子。

4(V)8(I)

(上面的代码)

预期结果:8 / 4

但由于某种原因,它不断触发对标题的期望,并拒绝继续编写代码。 它与不想成为双重的正则表达式字符串有关,是的,但我在网上找不到任何答案。 另外,我的在线朋友不使用 Dart 编码,这让我创建了这个帐户并在这里提出问题。 🥲

如果您有任何答案和建议,请接受!

如果对我的代码有任何疑问,我很乐意回答。

您正在尝试将调用fir.firstMatch(expression)的结果转换为double ,但fir.firstMatch(expression)返回RegExpMatch ,这不是 dart 知道如何变成double的东西。 但是,您可以通过从匹配中检索适当的组来获取匹配的String值,然后从字符串中解析双精度。 可能像

val match = fir.firstMatch(expression);
val doubleAsString = match.group(0);
val pri = double.parse(doubleAsString);

这是 dart 的RegExpMatch类的文档: https ://api.dart.dev/stable/2.17.6/dart-core/RegExpMatch-class.html

经过一段时间与一些在线朋友的头脑风暴后,我和他们找到了解决方案!

使用 matchString 来获取我想要的子字符串,就像我之前提到的示例一样,然后使用 parse 将文字数字转换为双精度字符串,我可以从字符串中获取我想要的值! 出于某种原因,JavaScript 需要做这部分逻辑而不是 Dart,因为 as 不能用 Regex 做文字值。

然后将此双精度转换回字符串,我可以使用 toString() 方法来定义数字的文字并使用 replace() 替换它们。

上面解析的代码应该是这样的:

if (expression.contains("(V)") &&
            expression.contains("(I)") &&
            ohm) {
          expression = equation.replaceAll("(I)", "/");
          expression = expression.replaceAll("(V)", "/");
          expression = expression.replaceFirst("/", "First");
          expression = expression.replaceAll("/", "Second");
          RegExp fir = RegExp("^[^F]*");
          RegExp sec = RegExp("(?<=t)(.*?)(?=S)");
          double pri = 0;
          double seg = 0;
          pri = double.parse(fir.stringMatch(expression)!);
          seg = double.parse(sec.stringMatch(expression)!);
          if (seg > pri) {
            expression = expression.replaceFirst(fir, seg.toString());
            expression = expression.replaceFirst(sec, pri.toString());
          }
          expression = expression.replaceFirst("First", "/");
          expression = expression.replaceFirst("Second", "");
        }

请注意,在代码中,我也有感叹号,因此它可以预期为空值。 运行设置代码也需要它。

因此,代码现在按以下顺序运行:

表达式:4(V)8(I)

4/8/

4前8秒

“正则表达式逻辑”

8First4Second

8/4秒

8/4

希望这可以帮助任何遇到或将遇到与我相同的问题的人! 小心!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM