Удаление избыточного escape в соответствии с рекомендациями Android Studio приводит к сбою приложения

#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") , чтобы избавиться от этого раздражающего ложного предупреждения.