Bagaimana mencocokkan "karakter apa saja" dalam ekspresi reguler?

305

Yang berikut harus dicocokkan:

AAA123
ABCDEFGH123
XXXX123

dapat saya lakukan ".*123":?

Saobi
sumber
2
Tautan ini menunjukkan pendekatan yang sepertinya berfungsi -> [^] + Yang berarti 'tidak cocok dengan karakter', negatif ganda yang dapat dibaca kembali sebagai 'cocok dengan karakter apa pun'. Sumber - loune.net/2011/02/…
Hoki

Jawaban:

645

Ya kamu bisa. Itu seharusnya bekerja.

  • . = char apa saja
  • \. = karakter titik yang sebenarnya
  • .?= .{0,1}= cocok dengan char nol atau satu kali
  • .*= .{0,}= cocok dengan karakter nol atau lebih banyak kali
  • .+= .{1,}= cocok dengan karakter apa saja satu kali atau lebih
Delan Azabani
sumber
22
Tidak selalu dot berarti char. Pengecualian saat mode single line. \ p {all} seharusnya
martian
Bagaimana Anda bisa memasukkan garis miring ke daftar karakter ini?
Hasil Pencarian Hasil web Pi
1
@pippilongstocking Backward slash adalah `\\`
Poutrathor
58

Ya itu akan berfungsi, meskipun perhatikan bahwa .tidak akan cocok dengan baris baru kecuali Anda melewati flag DOTALL saat mengkompilasi ekspresi:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
BlueRaja - Danny Pflughoeft
sumber
11
Itu beberapa informasi yang sangat berguna! Saya berasumsi .akan cocok dengan baris baru. Saya senang saya membaca jawaban Anda, saya harus menggunakannya!
Ben Kane
Anda juga kadang-kadang perlu mencocokkan baris baru di regex Java dalam konteks di mana Anda tidak dapat melewati Pattern.DOTALL, seperti saat melakukan pencarian regex multi-line di Eclipse, atau sebagai pengguna aplikasi Java apa pun yang menawarkan pencarian regex. Berdasarkan panduan regular-expression.info , Anda mungkin perlu menggunakan {.,\n,\r,\u2028,\u2029,\u0085}untuk benar-benar mencocokkan semua karakter (karakter Unicode adalah karakter penghentian baris tambahan yang ditambahkan tidak cocok dengan .di Jawa), tetapi hanya {.,\n,\r}akan berfungsi untuk sebagian besar file teks.
Theodore Murdock 3-15
8
@TheodoreMurdock [\s\S]adalah cara populer untuk mencocokkan karakter apa pun jika Anda tidak dapat menggunakan DOTALL.
mpen
Kalau-kalau itu akan terlintas di pikiran Anda, JANGAN gunakan (?:.|\\v)*, karena JDK-6337993 .
Olivier Cailloux
22

Gunakan pola .untuk mencocokkan karakter apa saja sekali, .*untuk mencocokkan karakter apa pun nol atau lebih banyak, .+untuk mencocokkan setiap karakter satu atau lebih kali.

thr
sumber
11

Ada banyak pengujian regex canggih dan alat pengembangan, tetapi jika Anda hanya ingin memanfaatkan uji sederhana di Jawa, berikut ini satu untuk Anda mainkan:

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

Sekarang Anda dapat dengan mudah menambahkan testcases baru dan mencoba pola baru. Bersenang-senang menjelajahi regex.

Lihat juga

polygenelubricants
sumber
1
Suara positif hanya untuk tautan regular-expressions.info. Situs luar biasa untuk mempelajari ekspresi reguler dan untuk referensi.
Freiheit
9

Tidak, *akan cocok dengan karakter nol atau lebih. Anda harus menggunakan +, yang cocok dengan satu atau lebih.

Ungkapan ini mungkin bekerja lebih baik untuk Anda: [A-Z]+123

Huusom
sumber
1
Suara positif di sini. OP tidak menentukan, tetapi tampaknya benar untuk menambahkan bahwa pola tersebut akan cocok dengan karakter apa pun termasuk hal-hal seperti ### 123, 123123,% $ # 123 yang mungkin tidak diinginkan OP. Kelas karakter yang digunakan @Huusom di atas semua OP akan menggunakan hanya huruf alfabet huruf besar yang mungkin maksudnya.
techdude
9

Cara paling umum yang saya lihat untuk menyandikan ini adalah dengan kelas karakter yang anggotanya membentuk partisi dari semua karakter yang mungkin.

Biasanya orang menulis bahwa sebagai [\s\S](spasi atau non-spasi), meskipun [\w\W], [\d\D], dll semua akan bekerja.

Jamie Davis
sumber
2
Untuk referensi, dari regular-expressions.info/dot.html : "JavaScript dan VBScript tidak memiliki opsi untuk membuat karakter pemecah garis titik pencocokan. Dalam bahasa tersebut, Anda dapat menggunakan kelas karakter seperti [\ s \ S] untuk mencocokkan karakter apa pun. Karakter ini cocok dengan karakter yang merupakan karakter spasi putih (termasuk karakter pemisah baris), atau karakter yang bukan karakter spasi putih. Karena semua karakter adalah spasi putih atau non-spasi putih, kelas karakter ini cocok dengan karakter apa pun . "
Dean Or
7

.*dan .+untuk karakter apa pun kecuali untuk baris baru.

Melarikan diri ganda

Untuk jaga-jaga, Anda ingin menyertakan baris baru, ekspresi berikut mungkin juga berfungsi untuk bahasa-bahasa yang diperlukan pelarian ganda seperti Java atau C ++:

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

untuk nol atau lebih banyak kali, atau

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

untuk satu atau lebih kali.

Pelarian Tunggal:

Pelarian ganda tidak diperlukan untuk beberapa bahasa seperti, C #, PHP, Ruby, PERL, Python, JavaScript:

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

Uji

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));
        }
    }
}

Keluaran

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

Jika Anda ingin menjelajahi ekspresi, sudah dijelaskan di panel kanan atas regex101.com . Jika mau, Anda juga dapat menonton di tautan ini , bagaimana itu cocok dengan beberapa input sampel.


Sirkuit RegEx

jex.im memvisualisasikan ekspresi reguler:

masukkan deskripsi gambar di sini

Emma
sumber
1
Bukankah itu sudah dijawab di sini? stackoverflow.com/a/55149095/5424988
Burung keempat
Saya suka (\W|\w)*bukannya melarikan diri ganda
Sudip Bhattarai
1
Sangat membantu menjelaskan
Nagibaba
5

Solusi spesifik untuk contoh masalah: -

Cobalah [A-Z]*123$akan cocok 123, AAA123, ASDFRRF123. Jika Anda membutuhkan setidaknya karakter sebelum 123digunakan [A-Z]+123$.

Solusi Umum untuk pertanyaan (Bagaimana mencocokkan "karakter apa saja" dalam ekspresi reguler):

  1. Jika Anda mencari apa saja termasuk spasi, Anda dapat mencoba [\w|\W]{min_char_to_match,}.
  2. Jika Anda mencoba untuk mencocokkan apa pun kecuali spasi putih Anda dapat mencoba [\S]{min_char_to_match,}.
Akash Kumar Seth
sumber
2

[^]harus cocok dengan karakter apa pun, termasuk baris baru. [^CHARS] cocok dengan semua karakter kecuali untuk yang ada di CHARS . Jika CHARS kosong, cocok dengan semua karakter.

Contoh JavaScript:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.
Anonim
sumber
Maukah Anda menambahkan beberapa kode untuk memberi tahu kami apa yang telah Anda coba?
Jennis Vaishnav
1

Coba regex .{3,}. Ini akan cocok dengan semua karakter kecuali baris baru.

Ravi Shekhar
sumber
-4

Saya bekerja ini Tidak selalu titik berarti char. Pengecualian saat mode single line. \p{all}seharusnya

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");
}
Abrahan Gonzalez
sumber