Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Три символа подряд в произвольном порядке
 
 автор: stasmus   (28.08.2007 в 12:41)   письмо автору
 
 

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

   
 
 автор: SHAman   (28.08.2007 в 13:24)   письмо автору
 
   для: stasmus   (28.08.2007 в 12:41)
 

/a/
/b/
/c/
: )

   
 
 автор: SHAman   (28.08.2007 в 13:43)   письмо автору
 
   для: 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'}

   
 
 автор: stasmus   (28.08.2007 в 14:41)   письмо автору
 
   для: SHAman   (28.08.2007 в 13:43)
 

вот на таком наборе не работает
ammmcuuub

   
 
 автор: SHAman   (28.08.2007 в 14:44)   письмо автору
 
   для: stasmus   (28.08.2007 в 14:41)
 

А у меня сработало:) У вас есть /s?

   
 
 автор: stasmus   (28.08.2007 в 16:21)   письмо автору
 
   для: SHAman   (28.08.2007 в 14:44)
 

...

   
 
 автор: stasmus   (28.08.2007 в 14:31)   письмо автору
 
   для: 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))
{

   
 
 автор: SHAman   (28.08.2007 в 14:43)   письмо автору
 
   для: stasmus   (28.08.2007 в 14:31)
 

Выглядит как правильное:)
Да, протупил я:)

   
 
 автор: cheops   (28.08.2007 в 14:55)   письмо автору
 
   для: stasmus   (28.08.2007 в 12:41)
 

Можно воспользоваться следующим выражением
/[abc]{3}/

   
 
 автор: SHAman   (28.08.2007 в 15:08)   письмо автору
 
   для: cheops   (28.08.2007 в 14:55)
 

[abc]{3} не гарантирует, что будет ТОЧНО присутствовать вся троица. Кроме того, если естьлишние символы, они не будут учитываться. Строка "a1b2c" не пройдет.

   
 
 автор: cheops   (28.08.2007 в 15:31)   письмо автору
 
   для: SHAman   (28.08.2007 в 15:08)
 

Хм... пожалуй да, я бы остановился на вашем варианте - на трёх проверках - назначение объёмного регулярного выражения сложно понять - код становится менее читабельным и не факт, что одно регулярное выражение будет выполняться быстрее трёх.

   
 
 автор: SHAman   (28.08.2007 в 15:36)   письмо автору
 
   для: cheops   (28.08.2007 в 15:31)
 

Я бы сказал, что очень маловероятно, что одно выполняется быстрее трех:) Могу тесты провести, если интересно:) Мне не впервой:)

   
 
 автор: stasmus   (28.08.2007 в 16:24)   письмо автору
 
   для: SHAman   (28.08.2007 в 15:36)
 

да, трабла, РТФМ, я забыл /xs
но
/xs не сработало на
mmmcwuuuab

в моей версии на /х сработало :)

попробуй, даже интересно стало

   
 
 автор: Faraon   (28.08.2007 в 16:29)   письмо автору
 
   для: 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";
  
?>

   
 
 автор: SHAman   (28.08.2007 в 16:31)   письмо автору
 
   для: Faraon   (28.08.2007 в 16:29)
 

Faraon, это было мое первое предложение:) Это самое эффективное скорее всего:) Но интерес сделать это в одну регулярку:)

   
 
 автор: Trianon   (29.08.2007 в 02:00)   письмо автору
 
   для: SHAman   (28.08.2007 в 16:31)
 

Я думал, вы уже решили .. Это задача на опережающие положительные утверждения
  $text = "alphabetical order";
  echo   preg_match('/(?=[^a]*a)(?=[^b]*b)(?=[^c]*c)/',$text);

   
 
 автор: SHAman   (28.08.2007 в 16:32)   письмо автору
 
   для: stasmus   (28.08.2007 в 16:24)
 

Да, ты прав. Я не все варианты перебрал:) В любом случае, твоя быстрее. Я же говорю - протупил:)

   
 
 автор: stasmus   (29.08.2007 в 19:29)   письмо автору
 
   для: SHAman   (28.08.2007 в 16:32)
 

>echo preg_match('/(?=[^a]*a)(?=[^b]*b)(?=[^c]*c)/',$text);
разъясните логику если не трудно

   
 
 автор: Unkind   (29.08.2007 в 20:18)   письмо автору
 
   для: stasmus   (29.08.2007 в 19:29)
 

> разъясните логику если не трудно

Здесь используются три lookahead-условия, которые позволяют "заглянуть вперед".
Такое условие записывается так: (?=RegularExpression)
Есть еще одно lookahead-условие: (?!RegularExpression), которое позволяет наоборот сказать "найти то, за которым не следует вот это".
Также существует два lookbehind-условия.
(?<RegularExpression) и (?<!RegularExpression).

[^a]*, [^b]* и [^c]* позволяют в данном случае не обращать внимания на посторонние символы, и, собственно, не обращать внимание на порядок этих букв - a, b, c.

   
 
 автор: stasmus   (29.08.2007 в 20:41)   письмо автору
 
   для: Unkind   (29.08.2007 в 20:18)
 

а зачем использовать такие lookahead-условия впринципе? и что будет если например так
(?=a) ? Какой смысл такой записи?

   
 
 автор: Unkind   (29.08.2007 в 21:05)   письмо автору
 
   для: stasmus   (29.08.2007 в 20:41)
 

Ну условия на практике могут быть нужны тогда, когда хочется достать какое-то значение и обработать его preg_replace'ом, не задевая при этом другие данные. Просто указать, что дальше/прежде должно быть, но не заносить в строку совпадения. Например,

<?php
$string 
"abc";
$string preg_replace("/b(?=c)/"""$string);
echo(
$string); //ac
?>

   
 
 автор: stasmus   (30.08.2007 в 14:29)   письмо автору
 
   для: Unkind   (29.08.2007 в 21:05)
 

спасибо, а откуда взята эта инфо? Можно линк желательно на рус

   
 
 автор: Unkind   (30.08.2007 в 14:36)   письмо автору
 
   для: stasmus   (30.08.2007 в 14:29)
 

Google, "Регулярные выражения"

   
 
 автор: cheops   (30.08.2007 в 19:57)   письмо автору
 
   для: stasmus   (30.08.2007 в 14:29)
 

Возможно вас заинтересует книга http://www.softtime.ru/info/fridl.php.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования