Làm cách nào để đối sánh toàn bộ chuỗi với regex?


82

Tôi cần một regex sẽ chỉ tìm các kết quả phù hợp trong đó toàn bộ chuỗi khớp với truy vấn của tôi.

Ví dụ: nếu tôi thực hiện tìm kiếm phim có tên "Tháng Mười Đỏ", tôi chỉ muốn khớp với tiêu đề chính xác đó (không phân biệt chữ hoa chữ thường) nhưng không khớp với các phim như "The Hunt For Red October". Không hoàn toàn chắc chắn tôi biết cách làm điều này. Có ai biết không?

Cảm ơn!


1
Tại sao bạn cần một regex cho một cái gì đó mà một cái đơn giản string.Containssẽ hoạt động?
Oded

1
Lý do tôi cần phải sử dụng một regex là tôi đang sử dụng nó cho một tìm kiếm trong MongoDB và tôi cần phải nó là trường hợp nhạy cảm mà chỉ có thể được thực hiện với một regex
Micah

Tại sao không chuyển đổi dữ liệu db (trực tuyến) thành chuỗi chữ thường và chữ thường của người dùng để tìm kiếm?
greenoldman

1
@macias Tôi không đồng ý rằng đó sẽ là một lựa chọn tốt hơn, nhưng tiếc là tình hình hiện tại của tôi không cho phép.
Micah

FYI, Nếu không yêu cầu sử dụng một regex, chỉ cần cố gắng để so sánh hai chuỗi bỏ qua trường hợp, chỉ cần có thể làmstring1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

Câu trả lời:


110

Hãy thử biểu thức chính quy sau:

^Red October$

Theo mặc định, biểu thức chính quy có phân biệt chữ hoa chữ thường. Các ^đánh dấu sự bắt đầu của văn bản phù hợp và $kết thúc.


1
FYI, đáng nói là để phân biệt chữ hoa chữ thường, khi tạo đối tượng regex, hãy thêm tham số thứ hai RegexOptions.IgnoreCase.
ToolmakerSteve

Điều này không hoạt động nếu có bất kỳ điều gì khác xung quanh chuỗi đó. Ví dụ: nếu bạn đang tìm kiếm "St" như trong Street, nhưng bạn có các chuỗi khác trên cùng một dòng cũng bắt đầu bằng "St", chẳng hạn như tên "Stirling" thì regex này sẽ không khớp chính xác. Tôi không chắc RegEx là câu trả lời phù hợp cho trường hợp này. Tôi sẽ tiếp tục cố gắng. Câu trả lời của Tim dưới đây là tốt, nhưng không phải tất cả các động cơ đều hỗ trợ điều này.
dyslexicanaboko

Trên thực tế, $không phải lúc nào cũng khớp với phần cuối của chuỗi, \zdoes ( \Ztương đương trong Python). Hãy xem câu trả lời của Tim Pietzcker . Nó đúng với JavaScript.
Wiktor Stribiżew

40

Nói chung, và với cài đặt mặc định, ^$neo là một cách tốt để đảm bảo rằng regex khớp với toàn bộ chuỗi.

Tuy nhiên, một số lưu ý:

Nếu bạn có thay thế trong regex của mình, hãy đảm bảo đặt regex của bạn trong một nhóm không chụp trước khi bao quanh nó bằng ^$:

^foo|bar$

tất nhiên là khác với

^(?:foo|bar)$

Ngoài ra, ^$có thể mang một ý nghĩa khác (bắt đầu / kết thúc dòng thay vì bắt đầu / kết thúc chuỗi ) nếu các tùy chọn nhất định được đặt. Trong các trình soạn thảo văn bản hỗ trợ biểu thức chính quy, đây thường là hành vi mặc định. Trong một số ngôn ngữ, đặc biệt là Ruby, hành vi này thậm chí không thể bị tắt.

Do đó, có một tập hợp các neo khác được đảm bảo chỉ khớp ở phần đầu / phần cuối của toàn bộ chuỗi:

\A khớp ở đầu chuỗi.

\Z khớp ở cuối chuỗi hoặc trước khi ngắt dòng cuối cùng.

\z khớp ở cuối chuỗi.

Nhưng không phải tất cả các ngôn ngữ đều hỗ trợ các neo này, đáng chú ý nhất là JavaScript.


4
đây là câu trả lời hữu ích nhất
Jeremy Danyow

18

Sử dụng các bổ ngữ ^$để biểu thị vị trí của mẫu regex so với đầu và cuối của chuỗi:

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail

10

Tôi biết rằng điều này có thể hơi muộn để trả lời điều này, nhưng có lẽ nó sẽ có ích cho người khác.

Cách đơn giản nhất:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}

2
IMHO đây là câu trả lời đơn giản ÍT NHẤT so với câu trả lời được chấp nhận. Nhưng nó là một sự thay thế.
ToolmakerSteve

Tôi thích câu trả lời này vì bản thân mã hiển thị hành vi dự định, thay vì sửa đổi regex (điều này có thể ít rõ ràng hơn đối với ai đó nhìn lướt qua mã mà ít hiểu về regex). Trục trặc tiềm ẩn là regex có thể được viết để nó có thể khớp với toàn bộ chuỗi hoặc một phần của nó, với hàm Regex.Match trả về kết quả khớp từng phần mặc dù có thể khớp hoàn toàn.
John Thoits

8

Bạn cần bao gồm regex của mình trong ^(đầu chuỗi) và $(cuối chuỗi):

^Red October$

0

Xin lỗi, nhưng điều đó hơi không rõ ràng.

Từ những gì tôi đọc, bạn muốn so sánh chuỗi đơn giản. Bạn không cần regex cho điều đó.

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());

1
Lý do tôi cần sử dụng regex là vì tôi đang sử dụng nó để tìm kiếm trong MongoDB và tôi cần nó không phân biệt chữ hoa chữ thường mà chỉ có thể thực hiện với regex.
Micah

-1

Bạn có thể làm như thế này Exemple nếu tôi chỉ muốn bắt một lần ký tự trừ a trong một chuỗi và nó có thể được kiểm tra bằng myRegex.IsMatch ()

^ [^ e] [e] {1} [^ e] $

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.