Làm thế nào để khớp với bất kỳ nhân vật nào trong biểu thức chính quy?


304

Những điều sau đây phải được khớp:

AAA123
ABCDEFGH123
XXXX123

tôi có thể làm gì ".*123"không?


2
Liên kết này hiển thị một cách tiếp cận có vẻ hiệu quả -> [^] + Có nghĩa là 'không khớp với các ký tự', một phủ định kép có thể đọc lại thành 'khớp với bất kỳ ký tự nào'. Nguồn - loune.net/2011/02/ từ
HockeyJ

Câu trả lời:


644

Vâng, bạn có thể. Cần làm việc.

  • . = bất kỳ char
  • \. = ký tự dấu chấm thực tế
  • .?= .{0,1}= khớp bất kỳ char nào hoặc một lần
  • .*= .{0,}= khớp bất kỳ char nào hoặc nhiều lần hơn
  • .+= .{1,}= khớp bất kỳ char nào một hoặc nhiều lần

22
Không phải lúc nào dấu chấm cũng có nghĩa là bất kỳ char. Ngoại lệ khi chế độ dòng đơn. \ p {all} nên là
martian

Làm thế nào bạn có thể bao gồm dấu gạch chéo ngược vào danh sách nhân vật này?
Kết quả tìm kiếm Kết quả web Pi

1
@pippilongstocking Dấu gạch chéo ngược là `\\`
Poutrathor

58

Có, nó sẽ hoạt động, mặc dù lưu ý rằng .sẽ không khớp với dòng mới trừ khi bạn vượt qua cờ DOTALL khi biên dịch biểu thức:

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

11
Đó là một số thông tin rất hữu ích! Tôi giả sử .sẽ phù hợp với dòng mới. Tôi rất vui vì tôi đã đọc câu trả lời của bạn, tôi cần sử dụng nó!
Ben Kane

Đôi khi, bạn cũng có thể cần khớp các dòng mới trong các bối cảnh Java trong các ngữ cảnh nơi bạn không thể vượt qua Pattern.DOTALL, chẳng hạn như khi thực hiện tìm kiếm regex nhiều dòng trong Eclipse hoặc với tư cách là người dùng của bất kỳ ứng dụng Java nào cung cấp tìm kiếm regex. Dựa trên hướng dẫn của biểu thức chính quy , bạn có thể cần sử dụng {.,\n,\r,\u2028,\u2029,\u0085}để khớp hoàn toàn bất kỳ ký tự nào (các ký tự Unicode là các ký tự kết thúc dòng bổ sung được thêm vào không khớp với .trong Java), nhưng chỉ {.,\n,\r}hoạt động với hầu hết các tệp văn bản.
Theodore Murdock

8
@TheodoreMurdock [\s\S]là một cách phổ biến để khớp bất kỳ nhân vật nào nếu bạn không thể sử dụng DOTALL.
mở

Trong trường hợp nó sẽ đến với tâm trí của bạn, KHÔNG sử dụng (?:.|\\v)*, vì JDK-6337993 .
Olivier Cailloux

22

Sử dụng mẫu .để khớp với bất kỳ ký tự nào một lần, .*để khớp với bất kỳ ký tự nào hoặc nhiều lần, .+để khớp với bất kỳ ký tự nào một hoặc nhiều lần.


11

Có rất nhiều công cụ kiểm tra và phát triển regex tinh vi, nhưng nếu bạn chỉ muốn một khai thác thử nghiệm đơn giản trong Java, thì đây là một công cụ để bạn chơi với:

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

Bây giờ bạn có thể dễ dàng thêm các mẫu thử mới và thử các mẫu mới. Hãy vui vẻ khám phá regex.

Xem thêm


1
Upvote chỉ dành cho liên kết chính quy-expressions.info. Trang web tuyệt vời để học các biểu thức thường xuyên và để tham khảo.
Freiheit

9

Không, *sẽ phù hợp với các ký tự không hoặc nhiều hơn. Bạn nên sử dụng +, phù hợp với một hoặc nhiều thay thế.

Biểu thức này có thể làm việc tốt hơn cho bạn: [A-Z]+123


1
Upvote đây. OP không chỉ định, nhưng có vẻ đúng khi thêm rằng mẫu sẽ khớp với bất kỳ ký tự nào, bao gồm những thứ như ### 123, 123123,% $ # 123 mà OP có thể không muốn. Lớp ký tự @Huusom sử dụng ở trên sẽ tất cả OP chỉ sử dụng các ký tự chữ cái in hoa có thể là ý định.
techdude

9

Cách phổ biến nhất mà tôi đã thấy để mã hóa điều này là với một lớp nhân vật có các thành viên tạo thành một phân vùng của tập hợp tất cả các ký tự có thể.

Thông thường người ta viết rằng như [\s\S](khoảng trắng hoặc không khoảng trắng), mặc dù [\w\W], [\d\D]vv sẽ tất cả công việc.


2
Để tham khảo, từ normal-expressions.info/dot.html : "JavaScript và VBScript không có tùy chọn để tạo các ký tự ngắt dòng khớp dấu chấm. Trong các ngôn ngữ đó, bạn có thể sử dụng một lớp ký tự, chẳng hạn như [\ s \ S] để khớp với bất kỳ ký tự nào. Ký tự này khớp với một ký tự là ký tự khoảng trắng (bao gồm các ký tự ngắt dòng) hoặc ký tự không phải là ký tự khoảng trắng. Vì tất cả các ký tự đều là khoảng trắng hoặc không phải khoảng trắng, lớp ký tự này khớp với bất kỳ ký tự nào . "
Trưởng khoa hoặc

7

.*.+là cho bất kỳ ký tự ngoại trừ các dòng mới.

Thoát hiểm đôi

Chỉ trong trường hợp, bạn sẽ muốn bao gồm các dòng mới, các biểu thức sau đây cũng có thể hoạt động đối với những ngôn ngữ cần thoát kép như Java hoặc C ++:

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

không hoặc nhiều lần, hoặc

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

cho một hoặc nhiều lần

Thoát đơn:

Không cần thoát kép cho một số ngôn ngữ như, C #, PHP, Ruby, PERL, Python, JavaScript:

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

Kiểm tra

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

Đầu ra

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

Nếu bạn muốn khám phá biểu thức, nó sẽ được giải thích ở bảng trên cùng bên phải của regex101.com . Nếu bạn muốn, bạn cũng có thể xem trong liên kết này , cách nó phù hợp với một số đầu vào mẫu.


Mạch RegEx

jex.im hình dung các biểu thức thông thường:

nhập mô tả hình ảnh ở đây


1
Không phải là đã được trả lời ở đây? stackoverflow.com/a/55149095/5424988
Con chim thứ tư

tôi thích (\W|\w)*thay vì trốn thoát gấp đôi
Sudip Bhattarai

1
Giải thích thực sự hữu ích
Nagibaba

5

Giải pháp cụ thể cho vấn đề mẫu: -

Hãy thử [A-Z]*123$sẽ phù hợp 123, AAA123, ASDFRRF123. Trong trường hợp bạn cần ít nhất một nhân vật trước khi 123sử dụng [A-Z]+123$.

Giải pháp chung cho câu hỏi (Cách khớp "bất kỳ ký tự" nào trong biểu thức chính quy):

  1. Nếu bạn đang tìm kiếm bất cứ thứ gì kể cả khoảng trắng bạn có thể thử [\w|\W]{min_char_to_match,}.
  2. Nếu bạn đang cố gắng khớp bất cứ thứ gì ngoại trừ khoảng trắng bạn có thể thử [\S]{min_char_to_match,}.

2

[^]phải phù hợp với bất kỳ nhân vật, bao gồm cả dòng mới. [^CHARS] phù hợp với tất cả các ký tự ngoại trừ các ký tự trong CHARS . Nếu CHARS trống, nó phù hợp với tất cả các ký tự.

Ví dụ về JavaScript:

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

Bạn có phiền khi thêm một số mã để cho chúng tôi biết những gì bạn đã cố gắng không?
Jennis Vaishnav

1

Hãy thử regex .{3,}. Điều này sẽ phù hợp với tất cả các nhân vật ngoại trừ một dòng mới.


-4

Tôi làm việc này Không phải lúc nào dấu chấm cũng có nghĩa là bất kỳ char. Ngoại lệ khi chế độ dòng đơn. \p{all}nên là

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");
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.