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

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

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

 

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

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

тема: как описать комбинацию в регулярных выражениях?
 
 автор: garazh   (01.04.2011 в 21:19)   письмо автору
 
 

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

скажем, есть три буквы a, b, c. допустимые выражения:

"a", "b", "ab", "ca", "cab"


недопустимые:

"", "aba", "cc", "cacb"


когда у меня было 3 буквы, я решил это некрасиво и громоздко через enumeration - просто перечислил все варианты общим числом 15. сейчас букв 6, и рисовать enumeration в 1956 значений как-то неэлегантно.

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

a?b?c?


такой шаблон пропускает "a", "ab", "ac" и не пропускает "aa" или "aca". но он пропускает "" и не пропускает "ca".

подмогните, гуры, а?

заранее бесконечно благодарен.

  Ответить  
 
 автор: garazh   (01.04.2011 в 21:26)   письмо автору
 
   для: garazh   (01.04.2011 в 21:19)
 

собственно, с пустой строкой можно побороться средствами XSD. скажем, можно написать так:

<xsd:simpleType name="attrType">
    <xsd:restriction base="xsd:string">
        <xsd:minLength value="1"/>
        <xsd:pattern value="a?b?c?"/>
    </xsd:restriction>
</xsd:simpleType>


но что делать с порядком - ума не приложу. :(

  Ответить  
 
 автор: Deed   (01.04.2011 в 22:25)   письмо автору
 
   для: garazh   (01.04.2011 в 21:19)
 


<?
$strok
="acbf";
$arr=preg_split("//",$strok);

$count=count($arr);
for(
$i=1;$i<$count-1;$i++){
    if(
preg_match_all("/$arr[$i]/",$strok,$out)>1){
        
$error="1"; break;
    }
    
    
}

if(
$error==1){
    echo 
"Строка $strok никуда не годится!";
}
else{
    echo 
"Строка $strok - нормальная строка!";
}
//Строка acbf -  нормальная строка!

$strok="acbc";
$arr=preg_split("//",$strok);

$count=count($arr);
for(
$i=1;$i<$count-1;$i++){
    if(
preg_match_all("/$arr[$i]/",$strok,$out)>1){
        
$error="1"; break;
    }
    
    
}

if(
$error==1){
    echo 
"Строка $strok никуда не годится!";
}
else{
    echo 
"Строка $strok - нормальная строка!";
}
//Строка acbc никуда не годится!
?>

  Ответить  
 
 автор: garazh   (01.04.2011 в 23:25)   письмо автору
 
   для: Deed   (01.04.2011 в 22:25)
 

написать скрипт/код, который бы валидировал строку по определенному мной правилу, я и сам могу (даже на фортране). мне бы регулярное выраженьице, которое бы я мог вставить в атрибут pattern моей XSD, и которое бы делало то же самое - валидировало значения XML-файла по заданному правилу.

  Ответить  
 
 автор: .heed   (02.04.2011 в 06:13)
 
   для: garazh   (01.04.2011 в 23:25)
 

Как.то с подсовпадениями
например
/^(?=[abcd]{1,4}$)(\w)(?!\w*\1)(\w)(?!\w*\2).....$/
//не проверял

  Ответить  
 
 автор: .heed   (02.04.2011 в 06:20)
 
   для: .heed   (02.04.2011 в 06:13)
 

Ili . Vmesto \w

  Ответить  
Rambler's Top100
вверх

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