Як зіставити "будь-який символ" у регулярному вираженні?


304

Слід відповідати наступному:

AAA123
ABCDEFGH123
XXXX123

я можу зробити: ".*123"?


2
Це посилання показує підхід, який, здається, працює -> [^] + Що означає "не відповідає жодним символам", подвійний мінус, який можна перечитати як "відповідати будь-якому символу". Джерело - loune.net/2011/02/…
ХокейJ

Відповіді:


643

Так, ти можеш. Це має спрацювати.

  • . = будь-який знак
  • \. = фактичний символ крапки
  • .?= .{0,1}= відповідати будь-якому знаку нуля або один раз
  • .*= .{0,}= відповідати будь-якому знаку нуля чи більше разів
  • .+= .{1,}= відповідати будь-якій знакові один чи кілька разів

22
Не завжди крапка - це означає будь-який знак. Виняток, коли однорядний режим. \ p {all} має бути
марсіанець

Як можна включити зворотну косу рису до цього списку символів?
Результати пошуку Веб-результати Pi

1
@pippilongstocking Зворотній косою рисою є `\\`
Poutrathor

58

Так, це спрацює, хоча зауважте, що .не буде відповідати новим рядкам, якщо ви не передасте прапор DOTALL при компілюванні виразу:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();

11
Ось така дуже корисна інформація! Я припускав, .що відповідає новим рядкам. Я радий, що я прочитав вашу відповідь, мені це потрібно використовувати!
Бен Кейн

Також іноді вам може знадобитися відповідність нових рядків в регексах Java в контекстах, де ви не можете пройти Pattern.DOTALL, наприклад, під час пошуку багаторядкового регексу в Eclipse, або як користувач будь-якого додатку Java, який пропонує пошук регулярного вибору. На основі посібника regular -pression.info , можливо, вам доведеться використовувати {.,\n,\r,\u2028,\u2029,\u0085}для узгодження абсолютно будь-якого символу (символи Unicode - це додаткові символи, що закінчуються рядками, додані, не збігаються з .Java), але просто {.,\n,\r}працюватимуть для більшості текстових файлів.
Теодор Мердок

8
@TheodoreMurdock [\s\S]- це популярний спосіб зіставлення будь-яких символів, якщо ви не можете використовувати DOTALL.
квітня

У випадку, якщо вам це здасться , НЕ використовуйте (?:.|\\v)*, через JDK-6337993 .
Олів'є Кайло

22

Використовуйте шаблон, .щоб порівнювати будь-який символ один раз, .*щоб відповідати будь-якому символу нульовим або більше разів, .+будь-якому символу один чи більше разів.


11

Існує безліч складних інструментів тестування та розробок регексу, але якщо ви просто хочете простий джгут тестування на Java, ось один із вас:

    String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }

Тепер ви можете легко додавати нові тести і спробувати нові шаблони. Весело вивчаючи регекс.

Дивись також


1
Оновіть лише за посиланням regular-expressions.info. Чудовий сайт для вивчення регулярних виразів та довідок.
Фрайхейт

9

Ні, *відповідатиме нулю або більше символів. Ви повинні використовувати +, що відповідає одному або більше замість цього.

Цей вираз може працювати для вас краще: [A-Z]+123


1
Оновити тут. ОП не вказала, але здається правильним додати, що шаблон буде відповідати будь-якому символу, включаючи речі, такі як ### 123, 123123,% $ # 123, які ОП може не захотіти. Клас символів @Huusom використовує вище, всі ОП використовуватимуть лише великі алфавітні символи, які, можливо, були наміром.
techdude

9

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

Зазвичай люди пишуть, що як [\s\S](пробіл або непробіл), хоча [\w\W], [\d\D]і т.д., все працювало б.


2
Для довідки з регулярного-expressions.info/dot.html : "JavaScript і VBScript не мають можливості робити символи розриву рядків крапки з точкою. На цих мовах ви можете використовувати клас символів, наприклад [\ s \ S] Цей символ відповідає символу, який є символом пробілу (включаючи символи розриву рядків), або символом, який не є символом пробілу. Оскільки всі символи або пробіли, або пробіли, цей клас символів відповідає будь-якому символу . "
Дін або

7

.*і .+є для будь-яких символів, крім нових рядків.

Подвійна втеча

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

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*

для нуля або більше разів, або

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+

на один або кілька разів.

Одномісний втечу:

Подвійне скасування не потрібно для деяких мов, таких як C #, PHP, Ruby, PERL, Python, JavaScript:

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+

Тест

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


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher matcher_3 = pattern_3.matcher(string);

        if (matcher_1.find()) {
            System.out.println("Full Match for Expression 1: " + matcher_1.group(0));
        }

        if (matcher_2.find()) {
            System.out.println("Full Match for Expression 2: " + matcher_2.group(0));
        }
        if (matcher_3.find()) {
            System.out.println("Full Match for Expression 3: " + matcher_3.group(0));
        }
    }
}

Вихідні дані

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

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


RegEx Circuit

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

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


1
Хіба на це вже не відповіли? stackoverflow.com/a/55149095/5424988
Четвертий птах

мені подобається (\W|\w)*замість подвійного втечі
Судіп Бхаттарай

1
Дуже корисне пояснення
Nagibaba

5

Конкретне рішення прикладу проблеми: -

Спробуйте [A-Z]*123$буде відповідати 123, AAA123, ASDFRRF123. У випадку, якщо вам потрібен хоча б символ перед 123використанням[A-Z]+123$ .

Загальне рішення питання (Як відповідати "будь-якому символу" у звичайному виразі):

  1. Якщо ви шукаєте що-небудь, включаючи пробіл, можете спробувати [\w|\W]{min_char_to_match,} .
  2. Якщо ви намагаєтеся відповідати чому-небудь, крім пробілу, ви можете спробувати [\S]{min_char_to_match,}.

2

[^]має відповідати будь-якому символу, включаючи новий рядок. [^CHARS] відповідає всім символам, за винятком символів CHARS . Якщо CHARS порожній, він відповідає всім символам.

Приклад JavaScript:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.

Не хотіли б ви додати якийсь код, щоб повідомити нам, що ви спробували?
Дженніс Вайшнав

1

Спробуйте регулярний вираз .{3,}. Це відповідатиме всім символам, крім нового рядка.


-4

Я працюю над цим Не завжди крапка - це означає будь-яку приналежність. Виняток, коли однорядний режим. \p{all}має бути

String value = "|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";
String expression = "[a-zA-Z0-9\\p{all}]{0,50}";
if(value.matches(expression)){
    System.out.println("true");
} else {
    System.out.println("false");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.