2012-04-17 4 views
3

У меня есть вопрос, связанный с регулярными выражениями в C#.Строки соответствия RegEx

Я хочу найти текст между "символами Примера:.

Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>("Esto es una prueba"); 

Матчи: Esto es una prueba

Но в этом примере

Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>("Esto es una prueba"); 
pKR_MESAPUESTOASIGNACION.CONFIGTORNEO_ID = Valid.GetInt(dr.Cells["CONFIGTORNEO_ID"].Value); 

Матчи: Esto es una prueba, но не должен совпадать CONFIGTORNEO_ID , потому что он написан между квадратными скобками ([])

Вкратце, я хочу совместить строку между символами двойной кавычки ("), но эту строку не следует записывать между квадратными скобками ([]).

Вот мой код:

var pattern = "\"(.*?)\""; 
var matches = Regex.Matches(fullCode, pattern, RegexOptions.Multiline); 

foreach (Match m in matches) 
{ 
    Console.WriteLine(m.Groups[1]); 
} 

Эта модель соответствует всем строке между " символами, но как я могу изменить шаблон, чтобы исключить те строки, которые написаны в квадратных скобках?

- редактировать ---

вот другой пример:

List<String> IdSorteados = new List<String>(); 
int TablesToSort = 0; 
foreach (UltraGridRow dr in fg.hfg_Rows) 
{ 
    if (dr.Cells["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"].Value == DBNull.Value && !Valid.GetBoolean(dr.Cells["BELIMINADO"].Value) && (Valid.GetBoolean(dr.Cells["Seleccionado"].Value) || SortearTodo)) 
     TablesToSort++; 
    } 

Выражение не должно совпадать MESA_ID (найденный в Cells["MESA_ID"].Value), ни Puesto (находится в пределах Cells["Puesto"].Value). Он также не должен соответствовать ].Value == DBNull.Value && dr.Cells[ (найдено в пределах ["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"])

Надеюсь, я сделал свое намерение понятным.

+0

Возможная публикация http://stackoverflow.com/questions/5153980/regexp-skip-pattern –

ответ

2

Простое использование негативный взгляд-за:

(?<!\[) 

В основном, соответствуют только строки, когда не предшествует [.Example here и код следующим образом:

String fullCode = "Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>(\"Esto es una prueba\");\r\n" 
       + "pKR_MESAPUESTOASIGNACION.CONFIGTORNEO_ID = Valid.GetInt(dr.Cells[\"CONFIGTORNEO_ID\"].Value);"; 
String pattern = @"(?<!\[)\x22(.*?)\x22"; 
var matches = Regex.Matches(fullCode, pattern, RegexOptions.Multiline); 
foreach (Match m in matches) 
{ 
    Console.WriteLine(m.Groups[1]); 
} 
+0

Большое спасибо. Он отлично работает. Он соответствует: if (dr.Cells ["MESA_ID"]. Значение == DBNull.Value && dr.Cells ["Puesto"]. Значение == DBNull = >>>]. Значение == DBNull.Value && dr.Cells [Как я могу указать, что я не хочу, чтобы строка начиналась с] и заканчивалась на [?? –

+0

@ Müsli: обновите свой вопрос еще несколькими версиями примерного контента, который вы фильтруете, и я выработаю решение, которое работает в большинстве случаев. Также обязательно укажите, что вы хотели бы найти/вернули. –

+0

@ Müsli: off-hand, попробуйте '@" (?

1

Чтобы избежать согласования цитируемый вложенные в квадратные скобки, вы должны проверить, что один из следующих условий:

  • Последнее непробельный символ, предшествующий открытию двойной котировки не[ или
  • Первый непробельный символа после закрытия двойной цитаты не]

Это можно сделать с помощью этого регулярного выражения:

(?<!\[\s*)\"[^"]*\"(?!\s*\]) 

Он использует lookaround особенности .NET регулярное выражение двигатель.

Обратите внимание, что это выражение избегает неохотного классификатора ? внутри указанной строки с использованием [^"]* вместо .*?.

+0

Это захватывает содержимое _inside_ квадратные скобки [безупречно] (http://regexr.com?30m05). –

+0

@BradChristie Спасибо, я забыл звездочки после моего '\ s 'Теперь это исправлено. – dasblinkenlight

+0

Действительно, я так много думал, но хотел дать вам возможность исправить. И как эта старая поговорка ушла? Квантеры над квалификаторами? –

0

Много раз мне приходилось разбирать файлы исходного кода (php | cpp | java | js | css | и т. Д.) И выполнять некоторые регулярные замены. Чтобы не заменять некоторые строки/сообщения, я маскирую все строки перед выполнением моих замещений, поэтому мне приходится записывать все возможные строки и маскировать их.

Это, как я захватить все строки: /(['"])(\\\1|.)*?\1/gm , что означает:

  • захвата все, что начинается с одного | кавычками: ['"]
  • может следовать ноль или более символов, даже по тот же символ кавычки (который не считается концом строки), если ему предшествует форвард-косая черта (оператор escape \): (\\\1|.)*
  • убедитесь, что вышеуказанный шаблон останавливается в первом случае, а не в последнем совпадении (То есть. не жадничайте): ?
  • наконец наша строка заканчивается, когда он следовал тем же самым, начиная одной | кавычками: \1

Я хочу этот поиск будет производиться как в глобальном масштабе (чтобы охватить все возможные совпадения) а также многострочный (строка не может продолжаться в новой строке, ограниченной CRLF, верно?)

Возможно, вам интересно не только найти, но и захватить эти группы строк, поэтому убедитесь, что вы помещаете в разделитель групп (\\\1|.)*?, который дает окончательный рисунок:

([\'"])((\\\1|.)*?)\1

Примеры строк Захваченные:

defined ('WP_DEBUG') || define('\WP_DEBUG', true); 
echo 'class="input-text card-number" type="text" maxlength="20"'; 
echo 'How are you? I\'m fine, thank you'; 

Check my pattern in an online regex tester.