#android #regex #unit-testing
#Android #регулярное выражение #модульное тестирование
Вопрос:
У меня есть регулярное выражение, как показано ниже
object MyRegtest {
val TEST = Pattern.compile("\{[^{}] \}")
}
Android Studio говорит, что у меня есть избыточный escape.
После их удаления в соответствии с рекомендациями Android Studio все стало так, как показано ниже
object MyRegtest {
val TEST = Pattern.compile("\{[^{}] }")
}
Кажется, все хорошо, так как при запуске моего модульного теста он компилируется и работает нормально. Обратите внимание, что оно отлично компилируется до и после изменений
@Test
fun addition_isCorrect() {
val matcher = MyRegtest.TEST.matcher("2 matches {GoOd} and {GrEaT}, not {} to catch")
while (matcher.find()) {
println(matcher.group())
}
}
При компиляции и запуске приложения (простой пример)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val matcher = MyRegtest.TEST.matcher("2 matches {GoOd} and {GrEaT}, not {} to catch")
while (matcher.find()) {
Log.d("Testing", matcher.group())
}
}
}
Это приведет к сбою
Caused by: java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 9
{[^{}] }
Если я верну исходное регулярное выражение, приложение compiles и тест будут работать нормально.
Я сделал что-то не так, или это рекомендация об ошибке из Android Studio? Почему рекомендуемое оптимизированное регулярное выражение работает только в модульном тестировании и сбой в приложении?
Комментарии:
1. Я отправил проблему в Google issuetracker.google.com/issues/167122876
Ответ №1:
В Android regex вам необходимо экранировать закрывающую фигурную скобку за пределами класса символов, в противном случае шаблон становится недействительным ( Syntax error in regexp pattern
ошибка отображается, как и ожидалось).
Уведомление, которое вы получаете от Android Studio, скорее всего, основано на стиле регулярных выражений Java, где }
символ не обязательно экранировать за пределами класса символов.
Итак, в этом случае Android Studio ошибается при уведомлении о «избыточном escape», оно не является избыточным в контексте регулярных выражений Android.
Комментарии:
1. Сейчас 2022 год, эта проблема все еще присутствует в Kotlin, и мы вынуждены добавить
@Suppress("RegExpRedundantEscape")
, чтобы избавиться от этого раздражающего ложного предупреждения.