Regex: bỏ qua trường hợp nhạy cảm


316

Làm thế nào tôi có thể làm cho regex sau đây bỏ qua trường hợp nhạy cảm? Nó phải phù hợp với tất cả các ký tự chính xác nhưng bỏ qua cho dù chúng là chữ thường hay chữ hoa.

G[a-b].*

Chỉ cần có cả chữ hoa và chữ thường trong regex hoặc chuyển đổi thành chữ hoa trước khi thực hiện khớp regex
Chetter Hummin

2
G [a-bA-B]. * Sẽ là điều hiển nhiên trong trường hợp chung này, độ nhạy trường hợp phụ thuộc vào nền tảng afaik và bạn không đưa ra một nền tảng.
Joachim Isaksson

16
Nếu bạn đang sử dụng Java, bạn có thể chỉ định điều này với lớp Mẫu : Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);.
james.garriss

Các tuỳ chọn khác Java ở đây: blogs.oracle.com/xuemingshen/entry/...
james.garriss

Lưu ý rằng để greping nó chỉ đơn giản là việc bổ sung các -isửa đổi. Ví dụ: grep -rni regular_expressionđể tìm kiếm 'thường xuyên_expression' 'này, trường hợp' i'ensensitive, hiển thị dòng 'n'umbers trong kết quả.
Gabriel Staples

Câu trả lời:


444

Giả sử bạn muốn toàn bộ regex bỏ qua trường hợp, bạn nên tìm icờ . Gần như tất cả các công cụ regex đều hỗ trợ nó:

/G[a-b].*/i

string.match("G[a-b].*", "i")

Kiểm tra tài liệu cho ngôn ngữ / nền tảng / công cụ của bạn để tìm cách xác định các chế độ phù hợp.

Nếu bạn chỉ muốn một phần của biểu thức không phân biệt chữ hoa chữ thường (như câu trả lời ban đầu của tôi được cho là), thì bạn có hai tùy chọn:

  1. Sử dụng các sửa đổi chế độ (?i)và [tùy chọn] (?-i):

    (?i)G[a-b](?-i).*
  2. Đặt tất cả các biến thể (nghĩa là chữ thường và chữ hoa) trong biểu thức chính quy - hữu ích nếu các công cụ sửa đổi chế độ không được hỗ trợ:

    [gG][a-bA-B].*

Một lưu ý cuối cùng: nếu bạn đang xử lý các ký tự Unicode ngoài ASCII, hãy kiểm tra xem công cụ regex của bạn có hỗ trợ chúng đúng cách hay không.


Xuất sắc! Hoạt động cho: perl -pe 's / ^ utf-8 \? B \ ?. * $ // gi' Cancer.1631, khớp / thay thế chuỗi "UTF-8? B?" trong tập tin Ung thư.1631. Điều này không thành công: perl -pe 's / ^ utf-8 \? B \ ?. * $ // g' Cancer.1631, do trường hợp không khớp.
Victoria Stuart

Bài đăng này sẽ rõ ràng hơn nhiều nếu nó không phải là một ví dụ cụ thể. Giống như những gì nếu bạn muốn bỏ qua trường hợp cho một từ khác, chẳng hạn như ".txt" và ".TXT". Nhìn vào câu trả lời này, tôi vẫn không chắc mình có thể làm điều này như thế nào.
Kyle Bridenstine

Vì một số lý do, regex mà bạn đã đăng không hoạt động trong findregex mở rộng .. ví dụ: find . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \)không hiển thị bất kỳ thư mục nào .. màu trắng tương tự find . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)mà không có bộ sửa đổi sẽ hiển thị các thư mục chính xác. Bất cứ ý tưởng tại sao?
alpha_989

Ở đây tôi đang cố gắng tìm tất cả các thư mục chỉ bắt đầu bằng các ký tự [a-c]trong thư mục hiện tại .. để thực hiện thêm một số thao tác ..
alpha_989

Thành thật mà nói, tôi đặt tùy chọn 2 trong phần chính của câu trả lời vì nó chung chung và hoạt động với tất cả các công cụ regex.
Puterdo Borato

154

Phụ thuộc vào việc thực hiện nhưng tôi sẽ sử dụng

(?i)G[a-b].

BIẾN ĐỔI:

(?i) case-insensitive mode ON    
(?-i) case-insensitive mode OFF

Hương vị regex hiện đại cho phép bạn áp dụng công cụ sửa đổi chỉ một phần của biểu thức thông thường. Nếu bạn chèn công cụ sửa đổi (? Im) vào giữa regex thì công cụ sửa đổi chỉ áp dụng cho phần của regex ở bên phải của công cụ sửa đổi. Với những hương vị này, bạn có thể tắt các chế độ bằng cách đặt trước chúng bằng dấu trừ (? -I).

Mô tả là từ trang: https : //www.THER-expressions.info/modifier.html


Đây là định dạng sửa đổi cho công cụ regex Tìm kiếm của TortoiseHg.
mwolfe02

Bạn có thể cho tôi biết làm thế nào điều này có thể đạt được trong shell Linux (nói trong egrep mà không cần sử dụng công tắc "-i") không?
Krishna Gupta

1
Giải thích những gì (?i)làm và làm thế nào để kết thúc nó ( (?-i)) sẽ thực sự hữu ích. Đó là lý do tại sao câu trả lời của bạn có 1/3 số phiếu như câu hỏi số 1 thay vì gần như nhiều, vì họ giải thích chi tiết tinh tế này.
Gabriel Staples

55

biểu thức chính quy để xác thực 'abc' bỏ qua trường hợp nhạy cảm

(?i)(abc)

1
Hoạt động hoàn hảo với logcat của Android Studio
Joe

Hoạt động trong python cũng vậy
conner.xyz

47

Các ilá cờ thường được sử dụng cho trường hợp vô hồn. Bạn không cung cấp một ngôn ngữ ở đây, nhưng nó có thể sẽ là một cái gì đó như /G[ab].*/ihoặc /(?i)G[ab].*/.


15

Để hoàn thiện, tôi muốn thêm giải pháp cho các biểu thức thông thường trong C ++ bằng Unicode:

std::tr1::wregex pattern(szPattern, std::tr1::regex_constants::icase);

if (std::tr1::regex_match(szString, pattern))
{
...
}

1
Ai đó có thể làm rõ cho tôi tại sao bài viết này đã bị hạ cấp? Giải pháp được chấp nhận sử dụng mã cụ thể và để hoàn thiện, tôi muốn thêm giải pháp cho các thư viện chuẩn của ngôn ngữ c ++. Theo ý kiến ​​của tôi, tôi đã tạo ra giá trị gia tăng cho một câu hỏi tổng quát hơn.
Frankenstein

5

Như tôi đã phát hiện ra từ bài đăng tương tự này ( ignorecase trong AWK ), trên các phiên bản cũ của awk (chẳng hạn như trên vanilla Mac OS X), bạn có thể cần phải sử dụng 'tolower($0) ~ /pattern/'.

IGNORECASEhoặc (?i)hoặc /pattern/imột trong hai sẽ tạo ra một lỗi hoặc trả lại đúng đối với tất cả các dòng.


2

C #

using System.Text.RegularExpressions;
...    
Regex.Match(
    input: "Check This String",
    pattern: "Regex Pattern",
    options: RegexOptions.IgnoreCase)

cụ thể: tùy chọn: RegexOptions.IgnoreCase


1

[gG] [aAbB]. * có thể là giải pháp mô phỏng nếu mẫu không quá phức tạp hoặc dài.


rất muốn biết tại sao câu trả lời này là sai cho câu hỏi nhất định?
alpha_989

Bạn có câu trả lời "không quá phức tạp hay dài dòng"
reggaeg Ức

Đây thực sự là giải pháp duy nhất hiệu quả cho trường hợp của tôi. Ngoài ra, nó có vẻ như là giải pháp chung nhất nên hoạt động ở mọi nơi. Tất cả các câu trả lời khác dường như rất cụ thể cho việc triển khai regex cụ thể.
Puterdo Borato

1

Ngoài các câu trả lời đã được chấp nhận:

Sử dụng Grep:

Lưu ý rằng để greping nó chỉ đơn giản là việc bổ sung các -isửa đổi. Ví dụ: grep -rni regular_expressionđể tìm kiếm 'thường xuyên_expression' 'này, trường hợp' i'ensensitive, hiển thị dòng 'n'umbers trong kết quả.

Ngoài ra, đây là một công cụ tuyệt vời để xác minh các biểu thức thông thường: https://regex101.com/

Vd: Xem biểu thức và Giải thích trong hình ảnh này.

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

Người giới thiệu:


0

Trong Java, hàm Regextạo có

Regex(String pattern, RegexOption option)

Vì vậy, để bỏ qua các trường hợp, sử dụng

option = RegexOption.IGNORE_CASE

0

Bạn có thể thực hành Regex Trong Visual Studio và Visual Studio Code bằng cách sử dụng find / thay thế.

Bạn cần chọn cả Trường hợp khớp và Biểu thức chính quy cho biểu thức regex với trường hợp. Khác [AZ] sẽ không làm việc. Mô tả hình ảnh trung tâm ở đây

Cộng đồng Visual Studio 2019


-2

Bạn cũng có thể dẫn chuỗi ban đầu của mình, mà bạn sẽ kiểm tra khớp mẫu, viết thường. Và sử dụng trong mẫu ký hiệu chữ thường 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.