Регулярні вирази, щоб відповідати словам певної довжини


78

Я хотів би знати, як регулярний вираз відповідає таким словам, щоб слова мали максимальну довжину. наприклад, якщо слово має довжину максимум 10 символів, я хотів би, щоб регулярний вираз відповідав, але якщо довжина перевищує 10, тоді регулярний вираз не повинен збігатися.

я намагався

^(\w{10})$

але це приносить мені збіги лише в тому випадку, якщо мінімальна довжина слова становить 10 символів. Якщо слово має більше 10 символів, воно все одно відповідає, але відповідає лише першим 10 символам.


Чи є причина, чому ви не хочете просто переглядати слова та вживати String.length()?
MAK

1
Так. Цей рядок є частиною великого рядка, що містить слова декількох форматів - дати, електронні листи, URL-адреси тощо у форматі, розділеному табуляцією. Я думаю написати складений регулярний вираз, щоб він відповідав цілому рядку.
Ананд Хемміге

Розумію. Оскільки слова розмежовані табуляцією, хіба не можна розділити їх (за допомогою String.split()або StringTokenizer), а потім подивитися на довжину кожного слова?
MAK

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

Відповіді:


84

Я думаю, ти хочеш \b\w{1,10}\b. \bВідповідає кордоні слова.

Звичайно, ви також можете замінити \bі ^\w{1,10}$. Це відповідатиме слову, що має не більше 10 символів, якщо є єдиним вмістом рядка. Я думаю, це те, що ти робив раніше.

Так як це Java, ви на самому справі є , щоб уникнути зворотної косої межі: "\\b\\w{1,10}\\b". Ви, мабуть, це вже знали, але це мене вже зрозуміло раніше.


Дякую. Я впевнений, що втеча і раніше мене отримувала ..: 0 Вираз, який ви вказали, відповідає 10 символам, якщо слово більше 10. Я не хочу, щоб воно відповідало, якщо слово перевищує 10 символів. Начебто протилежне \ w {10,} можна сказати ...!
Ананд Хемміге

1
@AnandHemmige: Який вираз? Той, що \bмає символ, не повинен нічого збігатися, якщо у слові більше 10 символів. Те саме стосується того, що закінчується на $. Вам слід спробувати останнє, якщо рядок - це лише одне слово.
Tikhon Jelvis

1
У моїй версії VI (gvim для Windows) мені потрібна зворотна коса риса (\), перш ніж {це зможе працювати.
Krisztián Balla

48
^\w{0,10}$ # allows words of up to 10 characters.
^\w{5,}$   # allows words of more than 4 characters.
^\w{5,10}$ # allows words of between 5 and 10 characters.

Я сподівався, що перший з них буде працювати як протилежність \ w {10,}, але це не так.
Ананд Хемміге

5
^і $закріпити регулярний вираз на початку і в кінці рядка. Якщо ви хочете витягти підчинення (слова певної довжини), то вам потрібно \bзамість них застосувати прикордонники слів: \b\w{1,10}\bзнайдуть слова довжиною від 1 до 10.
Тім Пітцкер,

Як оголосити регулярний вираз "допускає слова з 9 АБО 12 символів"?
Loi Nguyen Huynh

1
@LoiNguyenHuynh:^(?:\w{9}|\w{12})$
Тім Пітцкер

@TimPietzcker Я пробував сам, ^\w{9}|\w{12}$і це не спрацьовувало LoL, виявилося, мені потрібно взяти в полон( )
Лой Нгуен Хуйн

27

Довжина символів, що підходять.

{n,m}  n <= length <= m
{n}    length == n
{n,}   length >= n

І за замовчуванням двигун жадібний, щоб відповідати цій схемі. Наприклад, якщо вхідне значення 123456789, \ d {2,5} буде відповідати 12345, який має довжину 5.

Якщо ви хочете, щоб двигун повернувся, коли довжина 2 збігається, використовуйте \ d {2,5}?


3
Це було мені корисно, оскільки я шукав регулярний вираз, щоб знайти слова, більші за x.
Zenil

3

Спосіб 1

Межі слів тут чудово працювали б, наприклад, з:

\b\w{3,8}\b
\b\w{2,}
\b\w{,10}\b
\b\w{5}\b

RegEx Demo 1

Java

Деякі мови, такі як Java та C ++, потребують подвійного екранування:

\\b\\w{3,8}\\b
\\b\\w{2,}
\\b\\w{,10}\\b
\\b\\w{5}\\b

PS: \\b\\w{,10}\\bможе працювати не для всіх мов чи смаків.

Тест 1

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){


        final String regex = "\\b\\w{3,8}\\b";
        final String string = "words with length three to eight";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
        }

    }
}

Вихід 1

Full match: words
Full match: with
Full match: length
Full match: three
Full match: eight

Спосіб 2

Ще одним добре знаним методом є використання негативних оглядів:

(?<!\w)\w{3,8}(?!\w)
(?<!\w)\w{2,}
(?<!\w)\w{,10}(?!\w)
(?<!\w)\w{5}(?!\w)

Java

(?<!\\w)\\w{3,8}(?!\\w)
(?<!\\w)\\w{2,}
(?<!\\w)\\w{,10}(?!\\w)
(?<!\\w)\\w{5}(?!\\w)

RegEx Demo 2

Тест 2

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){


        final String regex = "(?<!\\w)\\w{1,10}(?!\\w)";
        final String string = "words with length three to eight";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
        }

    }
}

Вихід 2

Full match: words
Full match: with
Full match: length
Full match: three
Full match: to
Full match: eight

Схема RegEx

jex.im візуалізує регулярні вирази:

введіть тут опис зображення


Якщо ви хочете спростити / змінити / дослідити вираз, це було пояснено на верхній правій панелі regex101.com . Якщо ви хочете, ви також можете подивитися за цим посиланням , як це буде відповідати деяким зразкам входів.



1

Навіть я шукав той самий регулярний вираз, але хотів включити і всі спеціальні символи та пробіли. Тож ось регулярний вираз для цього:

^[A-Za-z0-9\s$&+,:;=?@#|'<>.^*()%!-]{0,10}$

1
Чим це відрізняється від "^. {0,10} $"?
Elhitch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.