|
|
|
| че-то в стопаре.
как написать рег.выражение
чтобы abc обязательно были в тексте все три, но в любом порядке и с любыми символами между любыми ? | |
|
|
|
|
|
|
|
для: stasmus
(28.08.2007 в 12:41)
| | /a/
/b/
/c/
: ) | |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 13:24)
| | Попробовал в одну регулярку впихнуть... Наверняка медленно работать будет... извините, что на Perl, но, думаю, смысл понятен.
#!/usr/bin/perl
print qq(Content-type: text/html\n\n);
$str = "a11111b33333222c2222";
if ($str =~ /((c*|b*|.*)a(c*|.*)b(a*|.*)c(b*|a*|.*)|
(c*|a*|.*)b(c*|.*)a(b*|.*)c(b*|a*|.*)|
(a*|b*|.*)c(a*|.*)b(c*|.*)a(b*|c*|.*)|
(c*|b*|.*)a(b*|.*)c(a*|.*)b(c*|a*|.*))/xs)
{print 'ok'}
else
{print 'err'}
|
| |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 13:43)
| | вот на таком наборе не работает
ammmcuuub | |
|
|
|
|
|
|
|
для: stasmus
(28.08.2007 в 14:41)
| | А у меня сработало:) У вас есть /s? | |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 14:44)
| | ... | |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 13:24)
| | >/a/
>/b/
>/c/
>: )
ну как вариант, я выкрутился так, правильно?
if (preg_match("/(a.*b.*c)|
(a.*c.*b)|
(c.*a.*b)|
(c.*b.*a)|
(b.*c.*a)|
(b.*a.*c)
/",$data))
{
|
| |
|
|
|
|
|
|
|
для: stasmus
(28.08.2007 в 14:31)
| | Выглядит как правильное:)
Да, протупил я:) | |
|
|
|
|
|
|
|
для: stasmus
(28.08.2007 в 12:41)
| | Можно воспользоваться следующим выражением
| |
|
|
|
|
|
|
|
для: cheops
(28.08.2007 в 14:55)
| | [abc]{3} не гарантирует, что будет ТОЧНО присутствовать вся троица. Кроме того, если естьлишние символы, они не будут учитываться. Строка "a1b2c" не пройдет. | |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 15:08)
| | Хм... пожалуй да, я бы остановился на вашем варианте - на трёх проверках - назначение объёмного регулярного выражения сложно понять - код становится менее читабельным и не факт, что одно регулярное выражение будет выполняться быстрее трёх. | |
|
|
|
|
|
|
|
для: cheops
(28.08.2007 в 15:31)
| | Я бы сказал, что очень маловероятно, что одно выполняется быстрее трех:) Могу тесты провести, если интересно:) Мне не впервой:) | |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 15:36)
| | да, трабла, РТФМ, я забыл /xs
но
/xs не сработало на
mmmcwuuuab
в моей версии на /х сработало :)
попробуй, даже интересно стало | |
|
|
|
|
|
|
|
для: stasmus
(28.08.2007 в 16:24)
| | Можно еще вот так попробовать :)
<?
$d="bafgfcdfsdfagfgnthy";
if(preg_match("/a/",$d)){
if(preg_match("/b/",$d)){
if(preg_match("/c/",$d)){
print "ok";
}else print "no";
}else print "no";
}else print "no";
?>
|
| |
|
|
|
|
|
|
|
для: Faraon
(28.08.2007 в 16:29)
| | Faraon, это было мое первое предложение:) Это самое эффективное скорее всего:) Но интерес сделать это в одну регулярку:) | |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 16:31)
| | Я думал, вы уже решили .. Это задача на опережающие положительные утверждения
$text = "alphabetical order";
echo preg_match('/(?=[^a]*a)(?=[^b]*b)(?=[^c]*c)/',$text);
|
| |
|
|
|
|
|
|
|
для: stasmus
(28.08.2007 в 16:24)
| | Да, ты прав. Я не все варианты перебрал:) В любом случае, твоя быстрее. Я же говорю - протупил:) | |
|
|
|
|
|
|
|
для: SHAman
(28.08.2007 в 16:32)
| | >echo preg_match('/(?=[^a]*a)(?=[^b]*b)(?=[^c]*c)/',$text);
разъясните логику если не трудно | |
|
|
|
|
|
|
|
для: stasmus
(29.08.2007 в 19:29)
| | > разъясните логику если не трудно
Здесь используются три lookahead-условия, которые позволяют "заглянуть вперед".
Такое условие записывается так: (?=RegularExpression)
Есть еще одно lookahead-условие: (?!RegularExpression), которое позволяет наоборот сказать "найти то, за которым не следует вот это".
Также существует два lookbehind-условия.
(?<RegularExpression) и (?<!RegularExpression).
[^a]*, [^b]* и [^c]* позволяют в данном случае не обращать внимания на посторонние символы, и, собственно, не обращать внимание на порядок этих букв - a, b, c. | |
|
|
|
|
|
|
|
для: Unkind
(29.08.2007 в 20:18)
| | а зачем использовать такие lookahead-условия впринципе? и что будет если например так
(?=a) ? Какой смысл такой записи? | |
|
|
|
|
|
|
|
для: stasmus
(29.08.2007 в 20:41)
| | Ну условия на практике могут быть нужны тогда, когда хочется достать какое-то значение и обработать его preg_replace'ом, не задевая при этом другие данные. Просто указать, что дальше/прежде должно быть, но не заносить в строку совпадения. Например,
<?php
$string = "abc";
$string = preg_replace("/b(?=c)/", "", $string);
echo($string); //ac
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(29.08.2007 в 21:05)
| | спасибо, а откуда взята эта инфо? Можно линк желательно на рус | |
|
|
|
|
|
|
|
|
для: stasmus
(30.08.2007 в 14:29)
| | Возможно вас заинтересует книга http://www.softtime.ru/info/fridl.php. | |
|
|
|