2009-04-27 3 views
1

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

"blah" - match 
("blah") - no match 
("blah") - no match 
( "blah") - no match 

Я получил (немаскированном):

"(?<=[^(]\s")(.*?)" 

, который работает с первыми тремя, но я не могу работать, как иметь дело с более чем одним пробелом между первым кронштейном и цитаты. Использование a + после того, как s - тот же результат, использование символа * означает оба последних двух совпадения. Есть идеи?

+0

Как насчет «(„л“», без закрывающей скобки? –

+0

не произойдет, я разборе VB – Patrick

ответ

3

Это должно работать:

/(?<![^(\s])\s*"([^"]*)"\s*(?![\s)])/ 
  • (?<![^(\s]) Первый утверждает, что нет никаких пробелов или левой скобки перед строкой.

  • Тогда \s* будет соответствовать любому количеству пробельных символов.

  • ("[^"]*") будет соответствовать кавычки и фиксировать содержимое.

  • \s* будет соответствовать любому количеству пробельных символов.

  • Последнее, (?![\s)]) будет утверждать, что нет пробелов или правых скобок.

Вместе они убедитесь, что все пробельные соответствует каждой \s*, и что они не граничащих скобку.

+0

Отлично, спасибо – Patrick

1

В PCRE, как я знаю, lookbehind должны быть фиксированной ширины. Если это остается верным в механизме PCRE C#, то вы не сможете сделать это так, как вы пытаетесь.

+1

Нет, .NET (движок регулярных выражений не является специфичным для C#) не поддерживает переменную длину – Lucero

+0

Ах, прекрасное тогда. – chaos

1

Заглянуть сзади требуется фиксированная ширина, но вы могли бы получить там выражение ниже. Это не предполагает гнездования.

/\G     # from the spot of the last match 
    (?:    # GROUP OF: 
    [^("]*   # anything but open-paren and double quote. 
    [(]    # an open-paren 
    [^)]*   # anything but closing-paren 
    [)]    # a closing-paren 
)*    # any number of times 
    [^"]*    # anything but double quote 

    "([^"]*)"   # quote, sequence of anything except quote, then ending quote 
/x 
+0

Если в кавычках есть какой-либо заключительный параграф, он все равно будет считаться закрывающим. –