【问题标题】:Why `Regex` has different behavior in src/test and src/androidTest?为什么`Regex` 在 src/test 和 src/androidTest 有不同的行为?
【发布时间】:2021-02-17 15:20:19
【问题描述】:

我的 Android 应用中有类似于以下代码的内容,

val regex = Regex("\\$\\{}")

它适用于src/test 中的单元测试,但它会抛出PatternSyntaxException 用于src/androidTest 中的单元测试,并且当我运行整个应用程序时,它有相同的异常。

这里是异常详情

java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 5
\$\{}
     ^
    at com.android.icu.util.regex.PatternNative.compileImpl(Native Method)
    at com.android.icu.util.regex.PatternNative.<init>(PatternNative.java:39)
    at com.android.icu.util.regex.PatternNative.create(PatternNative.java:35)
    at java.util.regex.Pattern.compile(Pattern.java:1426)
    at java.util.regex.Pattern.<init>(Pattern.java:1401)
    at java.util.regex.Pattern.compile(Pattern.java:959)
    at kotlin.text.Regex.<init>(Regex.kt:89)

我必须这样写才能让它在 Android 环境中工作。

val regex = Regex("\\$\\{\\}")

但是 android studio 会抱怨这个

有人知道为什么会这样吗?

【问题讨论】:

    标签: java android android-studio kotlin


    【解决方案1】:

    您似乎发现了一个错误。 { 必须转义; } 是一个奇怪的野兽:如果你打算匹配一个实际的 },你通常必须转义它,但是,如果一个正则表达式包含一个没有匹配开场白的结束 } 会发生什么?正则表达式规范对此并不特别清楚;显而易见的选择是要么失败,要么将其视为文字}。最后一个是试图假设程序员必须无限聪明并且不会出错,因此是完全愚蠢的,然而,android studio却强迫你陷入这种愚蠢。以这种方式工作有一个(不好的)理由,那就是正则表达式中的作案手法是“嘿,如果没有意义,假设文字是有意的”,但这不是普遍的(通常,) 必须始终被转义,例如)。它表现为在边缘的[] 块中有一个-,然后它被解释为文字。

    在我看来,“修复”似乎是接受 androidTest 的行为,因为这是一个非常奇怪的极端情况,并且“抛出异常”通常是比“对这些垃圾应该做什么做出奇怪的假设”更好的选择意思是'。它们是 2 个完全不同的正则表达式引擎,在未指明的极端情况下的差异可能是不可避免的,因此“它们必须在所有方面完全相同”的心态是行不通的。

    TL;DR:

    • 正确的正则表达式始终是转义 },即使您的引擎不需要它。
    • 向 android studio/intellij 发送错误报告,说明他们的警告很糟糕,需要删除。事实上,相反的情况更有必要,并说明例如android 内部引擎要求\\

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2013-05-19
      • 2021-12-08
      • 2015-12-25
      • 2021-01-27
      • 1970-01-01
      相关资源
      最近更新 更多