php
  • regex
  • perl
  • 2016-09-02 2 views 0 likes 
    0

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

    Вот пример того, что я хочу найти:

    $page_content .= '<meta http-equiv="refresh" 
    

    или

    $page_content .= 'Some other text here</p><meta http-equiv="refresh" 
    

    С или без предварительного белого пространства. Вот что я хочу, чтобы игнорировать

    //$page_content .= '<meta http-equiv="refresh" 
    

    снова с или без предшествующего белого пространства.

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

    Я попытался использовать взгляд за

    (?<!\/\/).*<meta http-equiv="refresh" 
    

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

    Еще одна вещь: Было бы здорово, если бы это было в одном регулярном выражении, а в цикле кода, чтобы я мог искать в Notepad ++ или другом редакторе, который поддерживает поиск reg exp. (Удивительно, как иначе один вопрос может быть прочитан/понят. Я думал, что я был довольно ясен, но из множества вполне обоснованных ответов ясно, что я мог бы включить намного больше деталей :-)

    +0

    считают используется жадный оператор '. *' ' –

    +0

    #^[^ /] {2}. * # M' может быть решением – JustOnUnderMillions

    +0

    '/^(?! \/\ /) /' вы пробовали с отрицательным совпадением? это будет игнорировать все, что начинается с '//' –

    ответ

    -1

    Для ввода указанного в вопросе:

    //$page_content .= '<meta http-equiv="refresh" 
    

    Это сделает вещь:

    use strict; 
    
    use warnings; 
    
    
    open my $fh, "<", "my_path\\data.txt"; 
    
    while (my $line = <$fh>) { 
        if ($line =~ /^(?!\/\/).*?<meta http-equiv=\"refresh\"/){ 
         print $line; 
        } 
    } 
    

    Если у вас есть пробелы или другие отступа операторы, использовать взгляд-за оператора: использование строги;

    use warnings; 
    
    
    open my $fh, "<", "c:\\users\\uidp7702\\desktop\\data.txt"; 
    
    while (my $line = <$fh>) { 
        if ($line =~ /(?<!\/\/)\$page_content\s.=\s\'.*?<meta http-equiv=\"refresh\"/){ 
         print $line; 
        } 
    } 
    
    +0

    спасибо. Это, похоже, работает на строках без отступов или предшествующих пробелов. Однако, если его отступы тогда совпадают со всеми, как прокомментированные, так и без комментариев. Поэтому я удалил начало строки ^, и он все еще соответствует всем ... поэтому я прочитал пробел^с пробелами как^\ s * и^*, но все равно соответствует всем. – user3797323

    +0

    Тогда вы должны указать в своем вопросе все варианты вашего ввода –

    +0

    Я обновил вопрос, чтобы отразить это. Мои мысли состояли в том, что, поскольку это было регулярное выражение, оно должно совпадать в любом месте строки, с предшествующими пробелами или пробелами после этого или с другим кодом до или после.Вместо точного соответствия для строки примера, которую я дал – user3797323

    0

    Просто удалите комментарий перед проверкой строки

    while (<$fh>) { 
    
        s|//.*||; 
    
        if (/<meta http-equiv="refresh"/) { 
         ...; 
        } 
    } 
    
    Смежные вопросы