Регулярные выражения отрицательный взгляд вперед

Я занимаюсь гимнастикой с регулярными выражениями. Я поставил себе задачу попытаться найти код C #, в котором используется оператор as, за которым не следует проверка на null, в разумном объеме. Теперь я не хочу разбирать код C #. Например, я хочу захватить фрагменты кода, такие как

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(x1.a == y1.a)

, но не захватить

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(x1 == null)

, ни в этом отношении

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(somethingunrelated == null) {...}
    if(x1.a == y1.a)

. Таким образом, любая случайная проверка на нуль будет считаться «хорошей проверкой» и, следовательно, не найдена.

Возникает вопрос: Как мне сопоставить что-то, гарантируя, что что-то еще не найдено в его окружении.

Я пробовал наивный подход, ища «как», а затем выполняя отрицательный просмотр в пределах 150 символы.

\bas\b.{1,150}(?!\b==\s*null\b)

Приведенное выше регулярное выражение, к счастью, соответствует всем приведенным выше примерам. Моя интуиция подсказывает мне, что проблема в том, что при просмотре вперед и последующем отрицательном просмотре можно найти много ситуаций, когда предварительный просмотр не находит '== null'.

Если я попытаюсь отрицать все выражение целиком, это тоже не поможет, это будет соответствовать большей части кода C #.

7
задан tchrist 29 August 2012 в 11:31
поделиться