2010-08-22 30 views

Trả lời

29

Bạn có thể sử dụng từ bổ nghĩa inline như sau:

// case insensitive match 
Regex MyRegex = new Regex(@"(?i)[a-z]+"); // case insensitive match 

hoặc, đảo ngược ý nghĩa của các sửa đổi bằng cách thêm dấu trừ-sign:

// case sensitive match 
Regex MyRegex = new Regex(@"(?-i)[a-z]+"); // case sensitive match 

hoặc chuyển đổi chúng bật và tắt:

// case sensitive, then case-insensitive match 
Regex MyRegex = new Regex(@"(?-i)[a-z]+(?i)[k-n]+"); 

Ngoài ra, bạn có thể sử dụng chế độ sửa đổi khoảng cú pháp sử dụng dấu hai chấm : và một ngoặc nhóm, mà phạm vi các sửa đổi để chỉ nhóm rằng:

// case sensitive, then case-insensitive match 
Regex MyRegex = new Regex(@"(?-i:[a-z]+)(?i:[k-n]+)"); 

Bạn có thể sử dụng nhiều bổ ngữ trong một lần như thế này (?is-m:text), hoặc cách khác, nếu bạn thấy rõ ràng hơn (?i)(?s)(?-m)text (Tôi không). Khi bạn sử dụng cú pháp chuyển đổi bật/tắt, hãy lưu ý rằng công cụ sửa đổi hoạt động cho đến lần chuyển đổi tiếp theo hoặc kết thúc của regex. Ngược lại, bằng cách sử dụng các nhịp sửa đổi chế độ, sau khoảng thời gian, hành vi mặc định sẽ được áp dụng.

Cuối cùng: các từ bổ nghĩa cho phép trong .NET là (sử dụng dấu trừ để đảo mode):

x cho phép khoảng trắng và bình luận của
s dòng duy nhất chế độ
m chế độ đa dòng
i trường hợp vô hồn
n chỉ cho phép chụp rõ ràng (.NET cụ thể)

+1

Cảm ơn. Vì vậy, nếu tôi muốn sử dụng nhiều công cụ sửa đổi, tôi chỉ làm '(? Imsx)' thay vì '(? I)', chẳng hạn? – Aillyn

7

Sử dụng tính năng theo cách này:

Regex MyRegex = new Regex(@"(?i:[a-z]+)"); 

Làm tiền tố tùy chọn nội tuyến cho mẫu của bạn bằng (?<option>:<pattern>). Trong trường hợp này, tùy chọn là "i" cho IgnoreCase.

Bằng cách chỉ định dấu hai chấm phía trên, bạn đang đặt tùy chọn cho mẫu đó. Để thực hiện các tùy chọn áp dụng cho toàn bộ mô hình bạn có thể đặt nó trong đầu ngày của riêng mình:

@"(?i)[a-z]+" 

Nó cũng có thể sử dụng nhiều tùy chọn và bật chúng lên và tắt:

// On: IgnoreCase, ExplicitCapture. Off: IgnorePatternWhitespace 
@"(?in-x)[a-z]+" 

này cho phép tính linh hoạt trong một mẫu để bật/tắt tùy chọn tại các điểm khác nhau của một regex không thể thực hiện được khi sử dụng RegexOptions trên toàn bộ mẫu.

Dưới đây là ví dụ hơi sâu.Tôi khuyến khích bạn chơi với nó để hiểu khi nào các tùy chọn có hiệu lực.

string input = "H2O (water) is named Dihydrogen Monoxide or Hydrogen Hydroxide. The H represents a hydrogen atom, and O is an Oxide atom."; 

// n = explicit captures 
// x = ignore pattern whitespace 
// -i = remove ignorecase option 
string pattern = @"di?(?nx-i) (hydrogen) | oxide"; 
var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); 
Console.WriteLine("Total Matches: " + matches.Count); 
foreach (Match match in matches) 
{ 
    Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups[1].Captures.Count); 
} 

Console.WriteLine(); 

// n = explicit captures 
// x = ignore pattern whitespace 
// -i = remove ignorecase option 
// -x = remove ignore pattern whitespace 
pattern = @"di?(?nx-i) (?<H> hydrogen) (?-x)|oxide"; 
matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); 
Console.WriteLine("Total Matches: " + matches.Count); 
foreach (Match match in matches) 
{ 
    Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups["H"].Captures.Count); 
} 

Kết quả cho ở trên là:

Total Matches: 3 
Match: Dihydrogen - Groups: 0 
Match: oxide - Groups: 0 
Match: oxide - Groups: 0 

Total Matches: 3 
Match: Dihydrogen - Groups: 1 
Match: oxide - Groups: 0 
Match: oxide - Groups: 0 

Trong cả hai mẫu RegexOptions.IgnoreCase được sử dụng cho phép "di" là trường hợp nhạy cảm và do đó phù hợp với "dihydrogen" (vốn D). Kể từ khi capturing rõ ràng là trên, ví dụ đầu tiên không có bất kỳ nhóm cho (hydrogen) vì nó không sử dụng một nhóm được đặt tên, đó là yêu cầu cho việc nắm bắt rõ ràng. Mẫu thứ hai có 1 nhóm vì nó sử dụng (?<H> hydrogen).

Tiếp theo, hãy lưu ý rằng mẫu thứ hai được sửa đổi để sử dụng (?-x)|oxide ở cuối. Kể từ IgnorePatternWhitespace bị tắt sau khi chụp hydro, phần còn lại của mẫu phải được tạo chính xác bằng cách không có khoảng trống bổ sung (so với mẫu đầu tiên) cho đến khi (?x) được bật sau trong mẫu. Điều này phục vụ không có mục đích thực sự nhưng chỉ cho thấy một cách sử dụng chiều sâu của các tùy chọn nội tuyến để chứng minh khi họ thực sự đá.

Các vấn đề liên quan