Как сопоставить «любой символ» в регулярном выражении?


305

Следующее должно соответствовать:

AAA123
ABCDEFGH123
XXXX123

я могу сделать: ".*123"?


2
Эта ссылка демонстрирует подход, который, кажется, работает -> [^] +, что означает «не соответствует ни одному символу», двойной минус, который можно перечитать как «соответствовать любому символу». Источник - loune.net/2011/02/…
ХоккейJ

Ответы:


645

Да, ты можешь. Это должно работать.

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

22
Не всегда точка означает любой символ. Исключение при однострочном режиме. \ p {все} должно быть
марсианин

Как вы можете включить обратную косую черту в этот список символов?
Результаты поиска веб-результаты 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, которое предлагает поиск регулярных выражений. Основываясь на руководстве регулярного выражения.info , вам может потребоваться использовать {.,\n,\r,\u2028,\u2029,\u0085}для сопоставления абсолютно любой символ (символы Юникода являются дополнительными символами в конце строки, добавляемыми без совпадения .в Java), но они {.,\n,\r}будут работать для большинства текстовых файлов.
Теодор Мердок

8
@TheodoreMurdock [\s\S]- это популярный способ сопоставления любого символа, если вы не можете использовать DOTALL.
mpen

В случае, если это придет вам в голову, НЕ используйте (?:.|\\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
Upvote только для регулярной ссылки-expression.info. Замечательный сайт для изучения регулярных выражений и для справки.
Freiheit

9

Нет, *будет соответствовать нулю или более символов. Вы должны использовать +, который соответствует одному или более.

Это выражение может работать лучше для вас: [A-Z]+123


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

9

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

Обычно люди пишут это как [\s\S](пробел или не пробел), хотя [\w\W], [\d\D]и т. Д. Все будет работать.


2
Для справки, из регулярных выражений.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
Действительно полезное объяснение
Нагибаба

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.