Рубрики
Без рубрики

Я не боюсь никаких регулярных выражений

Иногда знать, чего вы не хотите, так же важно, как знать, чего вы действительно хотите. Это верно для… Помеченный регулярным выражением, java.

Иногда знание того, что вы делаете не хотите, так же важно, как и знание того, чего вы действительно хотите. Это верно для регулярных выражений (регулярное выражение) , но это также верно для этой статьи, которая не предназначена для тех, кто уже привык к регулярным выражениям на ежедневной основе.

Но, если вам нужны какие-то понятные примеры, чтобы использовать его чаще, я надеюсь, что эта серия статей может вам помочь. ( здесь есть некоторая история, если хотите)

Все приведенные ниже примеры доступны в моем репозитории github , хотя, если вы хотите протестировать выражения во время чтения, я рекомендую использовать какую-нибудь страницу, которая анализирует их в реальном времени. Мне нравится использовать https://rubular.com/ , но не стесняйтесь выбирать свой. Теперь давайте закодируем: Импортируем эти пакеты в ваш класс:

импортируйте java.util.regex. Сопоставитель; импортируйте java.util.regex. Шаблон;

Допустим, вы хотите найти все слова, оканчивающиеся на “thing” в тексте. Вы могли бы сделать это таким образом:

Pattern pattern = Pattern.compile("\\w+thing");
Matcher matcher = pattern.matcher("A thing I want is to find something, or anything. I do not really care, but I do no want go with nothing at hand.");
while (matcher.find()) {
    System.out.println("Found " + matcher.group());
}

Если вы хотите добиться точно такого же результата без какого-либо использования регулярных выражений, это будет выглядеть примерно так:

String text = "A thing I want is to find something, or anything. I do not really care, but I do no want go with nothing at hand.";
String sufix = "thing";
String[] words = text.split(" ");
for (int i = 0; i < words.length; i++) {
    String word = words[i];
    if (word != null && word.contains(sufix)) { //"endsWith does not work because of "," and "."
        if (word.length() != sufix.length()) { //remember, you want words ending with "thing", but not the words itself
            System.out.println(word
                    .replace(".", "")
                    .replace(",", "")
            );
        }
    }
}

Обратите внимание, что это простой пример. В более сложном сценарии вам нужно было бы вручную проверить многие другие вещи.

Но давайте продолжим, не так ли?

Что означает “\\w+thing” ? Что ж, “thing” – это нужный вам суффикс, я полагаю, это довольно очевидно, давайте взглянем на “\\w +” .

“\\”

Когда вы видите две обратные косые черты, это просто означает, что экранирующий символ экранирует другой экранирующий символ. Так что читайте, поскольку это была только одна обратная косая черта ( “[\w]+thing” );

\w

Означает любой символ слова. Любая буква от а до я (и от А до Я) , любая цифра и “_”. Не могли бы вы написать это по-другому? Да, регулярное выражение ” [a-zA-Z_]+thing” имеет точно такой же результат (Мы просто поговорим о скобках) . Я вам верю, потому что этот вариант, если он будет более явным, будет легче поддерживать, продолжайте. Регулярное выражение, как и большинство других вещей, имеет много способов получить один и тот же результат. Итак, скобки…

[ ]

Это означает варианты символов, которые вы хотите найти. Если вы ставите только a “a” или “b” , вы бы написали [ab] . Если вам нужны буквы от строчной буквы a до z, вы бы написали [a-z] , если вы хотите использовать только строчные буквы от a до h, напишите [a-h] и так далее. О… вы заметите, что в образцах гораздо больше скобок, чем нужно, но результаты те же.;

+

Это не операция добавления. Символ “+” означает, что символы слева обязательны для заполнения. Если вы замените его на “*” , это означает необязательный, вы увидите, что слово “вещь” Теперь я тоже буду отображаться

Продолжать. Попробовать это. Я буду ждать здесь…

Теперь, если вы возьмете из этой операции символы (“\wthing”) вы увидите другой результат. Это принесет следующие значения:

вещь вещь что-то еще

Потому что совпадения поймут, что вам нужен любой символ слова перед “thing”. Но только один. Ты хочешь две? Используйте “\w{2}вещь” и вы получите:

я ничего, ничего, ничего

Вы хотите, чтобы перед суффиксом было как минимум три, но не хотите ограничивать его размер? Использование “\w{3,}thing” и “ничего” не будет приведено:

что-нибудь, что угодно

Вам нужен хотя бы один персонаж, но не более трех? Попробуйте “\w{1,3}вещь” :

что-нибудь, что угодно, ничего

И теперь вы, возможно, думаете, что не хотите, чтобы в ваших результатах были разбитые слова. Попробуйте “\W\w{1,3}вещь” . Это “\W” означает любой символ, не являющийся словом. Полная противоположность “\w” . Результатом будет:

ничего ничего

Я тоже мог бы быть написан “\s\w{1,3}thing” . “\s” означает любой символ пробела (да, “\S” означает любой символ, не содержащий пробела).

Как разработчик, вы, вероятно, подумали “Что произошло бы, если бы в начале фразы было целевое слово?” (В репозитории есть решение. Он не использует чисто регулярные выражения для решения, но эй, мы не ограничиваемся одним чистым решением, верно?)

Попробуйте столько вариантов, сколько захотите.

Скоро увидимся с более сложными ситуациями, связанными с регулярными выражениями.

Оригинал: “https://dev.to/buojira/i-ain-t-afraid-of-no-regex-54ig”