Почему это РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ соответствует этому шаблону?

#regex #intellij-idea

#регулярное выражение #intellij-idea

Вопрос:

Я не понимаю, почему мой шаблон соответствует определенным строкам в поиске / замене IntelliJ.

Я собираю подборку шаблонов регулярных выражений, полезных для поиска / замены определенных стандартов кодирования, таких как переключение нулевых проверок на наличие null в левой части. В этом случае я пытаюсь настроить конвертер isEmpty, который распознает сравнения .size или .length с 0, как в if(foo.size() == 0) или if(zig.zag().length == 0)

Однако мой шаблон

 ((?:w (?)?.) )blength(?)?|bsize() ?== ?0
  

соответствует foo.length как в

 for(int i=0; i<foo.length; i  )
  

Я бы хотел, чтобы этот шаблон соответствовал проверкам пустой строки / коллекции, таким как foo.length == 0 или bar.size() == 0 , чтобы преобразовать их для использования isEmpty() (т. Е. foo.isEmpty() ). Но не для соответствия другим случаям, таким как приведенный выше. Я также хотел бы, чтобы это РЕГУЛЯРНОЕ выражение было полезно как для проверки пустой строки , так и для проверки пустой коллекции.

Комментарии:

1. У строк Java нет size() метода, но у коллекций есть. Пожалуйста, очистите свой вопрос и проясните, какой именно код вы пытаетесь найти и заменить.

2. Я оставил его расплывчатым, потому что хотел, чтобы регулярное выражение соответствовало как пустой строке , так и проверкам пустой коллекции.

3. Это не очень хорошо подойдет для вашего вопроса. Пожалуйста, сузьте круг поиска.

4. Вы использовали обратную косую черту перед пробелом, следующим за == , я не знаю, как это будет себя вести, но в этом нет необходимости.

5. @TimBiegeleisen Я отредактировал вопрос в соответствии с вашим советом; теперь это более понятно?

Ответ №1:

| Оператор имеет очень низкий приоритет, вы должны заключить его в круглые скобки length|size() :

 (w*.) b(length|size()) ?== ?0
  

Комментарии:

1. | Оператор в данном случае является чередованием регулярных выражений (ИЛИ), не логическое ИЛИ. Таким образом, приоритет здесь не означает то же самое.

2. да, но выражение, которое у него есть, ищет либо что-то вроде foo.length , либо что-то вроде size() == 0

3. @TallChuck Я обновил шаблон регулярных выражений в исходном вопросе, чтобы он был ближе к окончательному шаблону, сохранив при этом первоначальную проблему; вы, вероятно, захотите соответствующим образом обновить свой ответ.

4. Я рад оставить все как есть, оно передает суть без слишком большого количества дополнительных символов