Java 为什么'Regex'在src/test和src/androidTest中有不同的行为?

Java 为什么'Regex'在src/test和src/androidTest中有不同的行为?,java,android,android-studio,kotlin,Java,Android,Android Studio,Kotlin,我的Android应用程序中有类似于以下代码的代码 val regex = Regex("\\$\\{}") 对于src/test中的单元测试,它工作得很好,但是对于src/androidTest中的单元测试,它抛出了PatternSyntaxException,当我运行整个应用程序时,它也有相同的异常 以下是例外情况的详细信息 java.util.regex.PatternSyntaxException: Syntax error in regexp pattern ne

我的Android应用程序中有类似于以下代码的代码

val regex = Regex("\\$\\{}")
对于
src/test
中的单元测试,它工作得很好,但是对于
src/androidTest
中的单元测试,它抛出了
PatternSyntaxException
,当我运行整个应用程序时,它也有相同的异常

以下是例外情况的详细信息

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)
但安卓工作室对此表示不满


有人知道为什么会发生这种情况吗?

您似乎发现了一个bug
{
必须转义;
}
是一个奇怪的怪兽:如果你想匹配一个实际的
}
,你通常必须转义它,但是,如果正则表达式包含一个没有匹配的开始符的结束
}
,会发生什么?regex规范对此并不特别清楚;显而易见的选择是要么失败,要么将其视为文本
}
。最后一个是试图假设程序员必须是无限明智的,不会出错,因此是完全愚蠢的,然而,android studio正迫使你如此愚蠢。这样做有一个(不好)的原因,那就是正则表达式中的操作方式是“嘿,如果没有意义,那么假设文字是有意的”,但这不是通用的(通常,
必须始终转义,例如)。它表现为在边缘的
[]
块中有一个
-
,然后它被解释为一个文本

在我看来,“修复”似乎是接受androidTest的行为,因为这是一个非常奇怪的极端情况,“抛出异常”通常是比“对垃圾的含义做出奇怪的假设”更好的选择。它们是两个完全不同的正则表达式引擎,在未加密的角落案例中的差异可能是不可避免的,因此“它们必须在所有方面完全相同”的心态是不可行的

TL;博士:

  • 正确的正则表达式是总是转义
    }
    ,即使您的引擎不需要它
  • 向android studio/intellij发送错误报告,说明其警告不正确,需要删除。事实上,相反的情况更值得一提,比如android内部引擎需要
    \
val regex = Regex("\\$\\{\\}")