2012-02-18 2 views
2

Я пытаюсь заставить трубу (ИЛИ) работать. У меня есть это регулярное выражение с этими тестами:Регулярное выражение ИЛИ (|) как это работает?

string output = "test: {0} matches"; 
    string test = "AND [Field] ="; 

    Regex r = new Regex(@"AND|OR\s[?\w+]?\s?="); 

    if (r.IsMatch(test)) 
     Console.WriteLine(string.Format(output, test)); 

    test = "OR [Field] ="; 
    if (r.IsMatch(test)) 
     Console.WriteLine(string.Format(output, test)); 

Первый матч проходит, но второй не удается. Я не могу понять, почему | между И и ИЛИ не действует как инструкция OR. Я попытался поставить круглые скобки вокруг AND | OR, но затем оба теста не пройдены.

Может ли кто-нибудь помочь мне с OR "|" заявление пожалуйста?

ответ

2

В регулярном выражении Чередование (|) имеет более низкий приоритет, чем последовательности. Ваш шаблон регулярного выражения интерпретируется как «AND или (OR, за которым следует \s[?\w+]?\s?=)» (обратите внимание на скобки, которые я добавил для обозначения приоритета).

Чтобы достичь желаемого, вам необходимо скопировать в свою AND|OR часть, а также избежать ваших [ и ] символов.

Regex r = new Regex(@"(AND|OR)\s\[?\w+\]?\s?="); 

Кроме того, вы, вероятно, не хотят, чтобы позволить [ без ] (или наоборот); либо оба должны присутствовать, либо нет:

Regex r = new Regex(@"(AND|OR)\s(\[\w+\]|\w+)\s?="); 
+0

Спасибо. Я забыл о соответствующих фигурных скобках. –

4

В дополнение к положить скобку вокруг (AND | OR), вы также должны бежать [и]:

(AND|OR)\s\[?\w+\]?\s?= 
+0

спасибо. Думал, что это будет что-то простое. –

Смежные вопросы