Java RegEx có phân biệt chữ hoa chữ thường không?


111

Trong Java, khi thực hiện một ReplaceAll để tìm kiếm một mẫu regex như:

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

(để xóa các từ trùng lặp không phân biệt chữ hoa chữ thường, ví dụ: Kiểm tra thử nghiệm), tôi không chắc mình đã đặt ký tự ở đâu ?i. Tôi đọc rằng nó được cho là ở đầu, nhưng nếu tôi lấy nó ra thì tôi bắt gặp các từ liên tiếp trùng lặp (ví dụ: kiểm tra thử nghiệm), nhưng không phải là các từ không phân biệt chữ hoa chữ thường (ví dụ: Kiểm tra thử nghiệm). Vì vậy, tôi nghĩ rằng tôi có thể thêm? I vào đầu nhưng điều đó dường như không hoàn thành công việc. Có suy nghĩ gì không? Cảm ơn!


kiểm tra điều này ra stackoverflow.com/a/55980176/3593084
Mr.Q

Câu trả lời:


119

RegexBuddy đang cho tôi biết nếu bạn muốn đưa nó vào đầu, đây là cú pháp chính xác:

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"

167

Bạn cũng có thể so khớp các regex không phân biệt chữ hoa chữ thường và làm cho nó dễ đọc hơn bằng cách sử dụng hằng số Pattern.CASE_INSENSITIVE như:

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);

2
Mmmm .... Bitwise bao gồm HOẶC hoạt động ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy

4
Đây là nhiều hơn nữa có thể đọc được hơn này (?i)điều, Java regexes là đã khá đọc: S
Bartek Banachewicz

Đây là câu trả lời giống với câu trả lời của relet 4 năm trước, nhưng nó nhận được tất cả các phiếu bầu. Kỳ quặc.
Zoomzoom

@Zoomzoom, không phải lúc tôi viết nó :) Nếu bạn kiểm tra lịch sử ấn bản của relet, bạn sẽ thấy nó đã thay đổi thành phiên bản này vào năm 2018 stackoverflow.com/posts/3436124/…
Christian Vielma

126

Có, có thể bật và tắt phân biệt chữ hoa chữ thường trong Java regex.

Có vẻ như bạn muốn một cái gì đó như thế này:

    System.out.println(
        "Have a meRry MErrY Christmas ho Ho hO"
            .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
    );
    // Have a meRry Christmas ho

Lưu ý rằng cờ nhúng Pattern.CASE_INSENSITIVE thì (?i)không \?i. Cũng lưu ý rằng một phần thừa \bđã bị loại bỏ khỏi mẫu.

Dấu (?i)được đặt ở đầu mẫu để phân biệt chữ hoa chữ thường. Trong trường hợp cụ thể này, nó không bị ghi đè sau này trong mẫu, do đó, trên thực tế, toàn bộ mẫu không phân biệt chữ hoa chữ thường.

Điều đáng chú ý là trên thực tế, bạn chỉ có thể hạn chế phân biệt chữ hoa chữ thường đối với các phần của toàn bộ mẫu. Vì vậy, câu hỏi đặt nó ở đâu thực sự phụ thuộc vào đặc điểm kỹ thuật (mặc dù đối với vấn đề cụ thể này, nó không quan trọng vì \wnó không phân biệt chữ hoa chữ thường).

Để chứng minh, đây là một ví dụ tương tự về việc thu gọn các chữ cái giống như "AaAaaA"chỉ "A".

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
    ); // A e I O u

Bây giờ, giả sử rằng chúng ta chỉ định rằng chỉ nên thu gọn quá trình chạy nếu nó bắt đầu bằng một chữ cái viết hoa. Sau đó, chúng ta phải đặt (?i)ở nơi thích hợp:

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
    ); // A eeEeeE I O uuUuUuu

Nói chung, bạn có thể bật và tắt bất kỳ cờ nào trong mẫu như bạn muốn.

Xem thêm

  • java.util.regex.Pattern
  • thường-expressions.info/Modifiers
    • Chỉ định chế độ bên trong biểu thức chính quy
      • Thay vì /regex/i( Pattern.CASE_INSENSITIVEtrong Java), bạn có thể làm/(?i)regex/
    • Chỉ Bật và Tắt Chế độ cho một phần của Cụm từ Thông dụng
      • Bạn cũng có thể làm /first(?i)second(?-i)third/
    • Các nhịp bổ trợ
      • Bạn cũng có thể làm /first(?i:second)third/
  • Regular-expressions.info/Word Boundaries (luôn có một \bgiữa a \wvà a \s)

Câu hỏi liên quan


36

Nếu toàn bộ biểu thức của bạn không phân biệt chữ hoa chữ thường, bạn có thể chỉ định CASE_INSENSITIVEcờ:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

Cảm ơn vì câu trả lời. Đây là điều hết sức tôi đang tìm kiếm. Trong python, chúng tôi có re.IGNORECASE đang tìm kiếm câu trả lời tương tự trong JAVA.
Doogle

0

Bạn cũng có thể dẫn chuỗi ban đầu của mình, mà bạn sẽ kiểm tra xem có khớp mẫu hay không, thành chữ thường. Và sử dụng trong các biểu tượng chữ thường mẫu của bạn tương ứng.

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.