Регулярное выражение для соответствия "все, кроме" строки - PullRequest
1 голос
/ 27 ноября 2008

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

Например, ищем все строки, которые не имеют a, b и c в них в этом порядке.

Итак,
abasfaf3 будет соответствовать, тогда как
asasdfbasc не будет

Ответы [ 4 ]

4 голосов
/ 27 ноября 2008

В Python:

>>> r = re.compile("(?!^.*a.*b.*c.*$)")
>>> r.match("abc")
>>> r.match("xxabcxx")
>>> r.match("ab ")
<_sre.SRE_Match object at 0xb7bee288>
>>> r.match("abasfaf3")
<_sre.SRE_Match object at 0xb7bee288>
>>> r.match("asasdfbasc")
>>>
2 голосов
/ 27 ноября 2008

в perl:

if($str !~ /a.*?b.*?.*c/g)
{
    print "match";
}

должно работать.

1 голос
/ 27 ноября 2008

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

  • Преобразование регулярного выражения в детерминированный конечный автомат
  • Преобразовать конечные условия автомата, чтобы он принимал перевернутый регулярный язык
  • Преобразуйте автомат обратно в регулярное выражение, последовательно удаляя узлы из автомата, сохраняя при этом его поведение. Удаление одного узла потребует объединения двух или более регулярных выражений, чтобы они учитывали удаленный узел.
  • Если у вас есть один начальный узел и один конечный узел, вы закончили: регулярное выражение, помечающее ребро между ними, является искомым искомым регулярным выражением.

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

echo azyxbc | awk '{ exit ($0 !~ /a.*b.*c/); }' && echo matched

Если вас это интересует, я рекомендую книгу Майкла Сипсера " Введение в теорию вычислений ".

0 голосов
/ 27 ноября 2008

на Java:

(?m)^a?(.(?!a[^b\r\n]*b[^\r\nc]*c))+$

соответствует

abasfaf3
xxxabasfaf3

не соответствует

asasdfbascf
xxxxasasdfbascf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...