2012-06-18 3 views
4

Рассмотрим следующие строки.NET Regex: отрицание предыдущего символа для первого символа в строке

"Some" string with "quotes" and \"pre-slashed\" quotes 

Использование регулярных выражений, я хочу, чтобы найти все двойные кавычки с не слэш перед ними. Поэтому я хочу, чтобы регулярное выражение, чтобы найти четыре матча для примера предложения Это ....

[^\\]" 

... нашел бы только три из них. Я полагаю, это из-за состояния машины регулярных выражений, которая сначала проверяет команду, чтобы отрицать наличие косой черты.

Это означает, что мне нужно написать регулярное выражение с каким-то внешним видом, но я не знаю, как работать с этими взглядами и lookbehinds ... я даже не уверен, что это то, что я ищу.

Следующая попытка возвращает 6, а не 4 матча ...

"(?<!\\) 

ответ

3
"(?<!\\") 

Это то, что вы ищете

Если вы хотите, чтобы соответствовать "Некоторые" и "кавычки", то

(?<!\\")(?!\\")"[a-zA-Z0-9]*" 

будет делать

Объяснение :

  • (?<!\\") - Отрицательный lookbehind. Указывает группу, которая не может соответствовать перед вашим основным выражением.
  • (?!\\") - Отрицательный взгляд. Определяет группу, которая не может соответствовать после основного выражения
  • "[a-zA-Z0-9]*" - Строка для соответствия между регулярными кавычками

Что значит - соответствовать что-нибудь, что не приходит с \ «до и \» после того, как, но содержится в двойных кавычках

0

Попробуйте

(?<!\\)(?<qs>"[^"]+") 

Объяснение

<!-- 
(?<!\\)(?<qs>"[^"]+") 

Options: case insensitive 

Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind) «(?<!\\)» 
    Match the character “\” literally «\\» 
Match the regular expression below and capture its match into backreference with name “qs” «(?<qs>"[^"]+")» 
    Match the character “"” literally «"» 
    Match any character that is NOT a “"” «[^"]+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
    Match the character “"” literally «"» 
--> 

код

try { 
    if (Regex.IsMatch(subjectString, @"(?<!\\)(?<qs>""[^""]+"")", RegexOptions.IgnoreCase)) { 
     // Successful match 
    } else { 
     // Match attempt failed 
    } 
} catch (ArgumentException ex) { 
    // Syntax error in the regular expression 
} 
1

Вы почти получили ее, переместить цитаты после просмотра назад, как:

(?<!\\)" 

быть также изделия случаев, как

"escaped" backslash \\"string\" 

Вы можете использовать выражение, как это обрабатывать те:

(?<!\\)(?:\\\\)*" 
Смежные вопросы