Regex: Соответствие исключением, без предвидения - действительно ли это возможно?

Есть так много ответов для PHP и MySQL, но вот код для PHP и Oracle для предотвращения SQL-инъекций, а также регулярное использование драйверов oci8:

$conn = oci_connect($username, $password, $connection_string);
$stmt = oci_parse($conn, 'UPDATE table SET field = :xx WHERE ID = 123');
oci_bind_by_name($stmt, ':xx', $fieldval);
oci_execute($stmt);
27
задан finnw 9 February 2010 в 12:58
поделиться

3 ответа

ОБНОВЛЕНИЕ: Это перестало работать "с два и следующие прежде oo" как @Ciantic, на который указывают в комментариях.

<час>
^(f(o[^o]|[^o])|[^f])*$

ПРИМЕЧАНИЕ: намного намного легче только инвертировать соответствие на стороне клиента вместо того, чтобы использовать вышеупомянутое regex.

regex предполагает, что каждый концы строки с символом новой строки, если это не тогда, видит regexs C++ и grep.

Примеры программ в Perl, Python, C++, и grep все дают тот же вывод.

  • жемчуг

    #!/usr/bin/perl -wn
    print if /^(f(o[^o]|[^o])|[^f])*$/;
    
  • C++ python

    #!/usr/bin/env python
    import fileinput, re, sys
    from itertools import ifilter
    
    re_not_foo = re.compile(r"^(f(o[^o]|[^o])|[^f])*$")
    for line in ifilter(re_not_foo.match, fileinput.input()):
        sys.stdout.write(line)
    
  • #include <iostream>
    #include <string>
    #include <boost/regex.hpp>
    
    int main()
    {
      boost::regex re("^(f(o([^o]|$)|([^o]|$))|[^f])*$");
      //NOTE: "|$"s are there due to `getline()` strips newline char
    
      std::string line;
      while (std::getline(std::cin, line)) 
        if (boost::regex_match(line, re))
          std::cout << line << std::endl;
    }
    
  • файл примера grep

    $ grep "^\(f\(o\([^o]\|$\)\|\([^o]\|$\)\)\|[^f]\)*$" in.txt
    

:

foo
'foo'
abdfoode
abdfode
abdfde
abcde
f

fo
foo
fooo
ofooa
ofo
ofoo

Вывод:

abdfode
abdfde
abcde
f

fo
ofo
30
ответ дан jfs 28 November 2019 в 05:34
поделиться

Можно обычно искать нечто и инвертировать результат соответствия regex от клиентского кода.

Для простого примера, скажем, Вы хотите проверить это, строка содержит только определенные символы.

Вы могли записать что как это:

^[A-Za-z0-9.$-]*$

и принимают true результат как допустимый, или как это:

[^A-Za-z0-9.$-]

и принимают false результат как допустимый.

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

1
ответ дан Joel Coehoorn 28 November 2019 в 05:34
поделиться

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

Моя первая реакция на эту ситуацию: Например, "каждая строка, в которой нет" foo ", заключалась в простом использовании опции -v invert sense of matching в grep.

grep -v foo

this возвращает все строки в файле, которые не соответствуют 'foo'

Это так просто, у меня сильное чувство, что я неправильно прочитал ваш вопрос ....

1
ответ дан 28 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: