Регулярное выражение для точного сопоставления строки с нечисловыми символами и числом переменной

#java #regex #katalon-studio

Вопрос:

Я боролся с этим и был бы признателен за любую помощь.

У меня есть строка кода, которая всегда выглядит так:

 Thread.sleep(1000)
 

Thread.sleep() это всегда фиксированная последовательность символов, но целое число внутри является переменным. Как бы я написал регулярное выражение, чтобы уловить это?

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

1. Вы хотите получить часть «1000» от Thread.sleep(1000) ? Целое число внутри является постоянным, а не переменным. 1000 не меняется. В любом случае, какова ваша цель? Мне кажется, это проблема XY.

2. У нас есть много строк кода, таких как Thread.sleep(1000) или Thread.sleep(100) или Thread.sleep(2500). Мы написали специальную функцию, чтобы заменить это. Я хочу выполнить поиск регулярных выражений в коде для этих строк и заменить их новой функцией.

3. @user15793316 Было бы еще лучше Thread.sleeps*(d ) . Это было бы внутри строки Java "Thread\.sleep\s*\(\d \)" . Иногда перед буквой могут быть пробелы () .

Ответ №1:

Вы можете использовать регулярное выражение, Threads*.s*sleeps*(s*d s*) .

Объяснение регулярного выражения:

  • Thread : Буквальный, Thread
  • s*.s* : . перед и после 0 пробелов
  • sleeps* : Литерал, sleep за которым следует 0 пробелов
  • (s* : Символ, ( за которым следует 0 пробелов
  • d s* : Одна или несколько цифр, за которыми следуют символы 0 пробелов.
  • ) : Персонаж, )

ДЕМОНСТРАЦИЯ:

 public class Main {
    public static void main(String[] args) {
        String x = "Some Thread.sleep(1000) text";
        x = x.replaceAll("Thread\s*\.\s*sleep\s*\(\s*\d \s*\)", "");
        System.out.println(x);
    }
}
 

Выход:

 Some  text
 

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

1. Так как вы используете \s* , вы можете опустить \R? , чтобы иметь тот же эффект.

2. Я бы подумал об уменьшении двойного пробела между словами, но это деталь. Хороший, подробный ответ.