Регулярний вираз: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
Рядок 150:
! Відповідність
|- valign="top"
| {{cn|<code><nowiki>{</nowiki>''n''<nowiki>}</nowiki>}}</code>
| Рівно ''n'' разів
| {{cn|<code><nowiki>colou{3}r</nowiki>}}</code>
| {{cn|<code>colouuur}}</code>
|- valign="top"
| {{cn|<code><nowiki>{</nowiki>''m''<nowiki>,</nowiki>''n''<nowiki>}</nowiki>}}</code>
| Від ''m'' до ''n'' включно
| {{cn|<code><nowiki>colou{2,4}r</nowiki>}}</code>
| {{cn|<code>colouur}}</code>, {{cn|<code>colouuur}}</code>, {{cn|<code>colouuuur}}</code>
|- valign="top"
| {{cn|<code><nowiki>{</nowiki>''m''<nowiki>,}</nowiki>}}</code>
| Не менше ''m''
| {{cn|<code><nowiki>colou{2,}r</nowiki>}}</code>
| {{cn|<code>colouur}}</code>, {{cn|colouuur}}<code>colouuurм, {{cn|<code>colouuuur}}</code> {{nobr|і т.д.}}
|- valign="top"
| {{cn|<code><nowiki>{,</nowiki>''n''<nowiki>}</nowiki>}}</code>
| Не більше ''n''
| {{cn|<code><nowiki>colou{,3}r</nowiki>}}</code>
| {{cn|<code>color}}</code>, {{cn|<code>colour}}</code>, {{cn|<code>colouur}}</code>, {{cn|<code>colouuur}}</code>
|}
 
Рядок 179:
! Відповідність
|- valign="top"
| {{cn|<code><nowiki>*</nowiki>}}</code>
| Нуль або більше
| {{cn|<code><nowiki>{0,}</nowiki>}}</code>
| {{cn|<code><nowiki>colou*r</nowiki>}}</code>
| {{cn|<code>color}}</code>, {{cn|<code>colour}}</code>, {{cn|<code>colouur}}</code> {{nobr|і т.д.}}
|- valign="top"
| {{cn|<code><nowiki>+</nowiki>}}</code>
| Одне або більше
| {{cn|<code><nowiki>{1,}</nowiki>}}</code>
| {{cn|<code><nowiki>colou+r</nowiki>}}</code>
| {{cn|<code>colour}}</code>, {{cn|<code>colouur}}</code> {{nobr|і т.д.}} (але не {{cn|<code>color}}</code>)
|- valign="top"
| {{cn|<code><nowiki>?</nowiki>}}</code>
| Нуль або одне
| {{cn|<code><nowiki>{0,1}</nowiki>}}</code>
| {{cn|<code><nowiki>colou?r</nowiki>}}</code>
| {{cn|<code>color}}</code>, {{cn|<code>colour}}</code>
|}
 
Часто використовується послідовність {{cn|<code><nowiki>.*</nowiki>}}</code> для позначення будь-якої кількості будь-яких символів між двома частинами регулярного виразу.
 
Символьні класи в поєднанні із квантифікаторами дозволяють установлювати відповідності з реальними текстами.
Рядок 204:
 
Якщо символи
{{cn|<code><nowiki>{</nowiki>}}</code>
{{cn|<code><nowiki>}</nowiki>}}</code>
не утворюють квантифікатор, їхнє спеціальне значення ігнорується.
 
Рядок 216:
|Текст =
 
Вираз {{cn|<code><nowiki>(<.*>)</nowiki>}}</code> відповідає рядку, що містить декілька тегів [[HTML]]-розмітки, цілком.
 
<code>{{Inverse|<nowiki><p><b>Вікіпедія</b> - вільна енциклопедія, у якій <i>кожен</i> може змінити або доповнити будь-яку статтю</p></nowiki>}}.</code>
 
Щоб виділити окремі теги, можна застосувати ледачу версію цього виразу:
{{cn|<code><nowiki>(<.*?>)</nowiki>}}</code>
Їй відповідає не весь показаний вище рядок, а окремі теги (виділені кольором):
 
Рядок 229:
У деяких реалізаціях квантифікаторам у регулярних виразах відповідає максимально довгий рядок із можливих (квантифікатори є ''жадібними'', {{lang-en|greedy}}).
Це може стати значною проблемою.
Наприклад, часто очікують, що вираз {{cn|<code><nowiki>(<.*>)</nowiki>}}</code> знайде в тексті [[тег (мова розмітки)|теги]] [[HTML]].
Однак, якщо в тексті є більше одного HTML-тегу, то цьому виразу відповідає цілком рядок, що містить множину тегів.
 
Рядок 235:
 
Цю проблему можна вирішити двома способами.
# Ураховувати символи, що ''не'' відповідають бажаному взірцю ({{cn|<code><nowiki><[^>]*></nowiki>}}</code> для вищеописаного випадку).
# Визначити квантифікатор як ''нежадібний'' (''ледачий'', {{lang-en|lazy}}) — більшість реалізацій дозволяють це зробити, додавши після нього знак питання.
 
Рядок 245:
! Ледачий
|- valign="top"
| {{cn|<code><nowiki>*</nowiki>}}</code>
| {{cn|<code><nowiki>*?</nowiki>}}</code>
|- valign="top"
| {{cn|<code><nowiki>+</nowiki>}}</code>
| {{cn|<code><nowiki>+?</nowiki>}}</code>
|- valign="top"
| {{cn|<code><nowiki>{</nowiki>''n''<nowiki>,}</nowiki>}}</code>
| {{cn|<code><nowiki>{</nowiki>''n''<nowiki>,}?</nowiki>}}</code>
|}
 
Рядок 267:
 
При пошуку виразу
<code>
{{cn|
<nowiki>(</nowiki>{{color|red|<nowiki>a</nowiki>}}<nowiki>+</nowiki>{{color|green|<nowiki>a</nowiki>}}<nowiki>+)+</nowiki>{{color|magenta|<nowiki>b</nowiki>}}
</code>
}}
у рядку {{cn|<code>aaaaa}} інтерпретатор піде приблизно таким шляхом:
# {{cn|<code>{{color|red|aaaaa}}}}</code>
# {{cn|<code>{{color|red|aaaa}}{{color|green|a}}}}</code>
# {{cn|<code>{{color|red|aaa}}{{color|green|a}}{{color|magenta|a}}}}</code>
# {{cn|<code>{{color|red|aa}}{{color|green|aaa}}}}
# {{cn|<code>{{color|red|aa}}{{color|green|aa}}{{color|magenta|a}}}}</code>
# {{cn|<code>{{color|red|aa}}{{color|green|a}}{{color|red|a}}{{color|green|a}}}}</code>
# {{cn|<code>{{color|red|a}}{{color|green|a}}{{color|red|a}}{{color|green|a}}{{color|magenta|a}}}}</code> — і тільки тут, перевіривши всі точки повернення, здасться.
 
При використанні ревнивого квантифікатора буде виконаний тільки перший крок алгоритму.
Рядок 291:
! Ревнивий
|- valign="top"
| {{cn|<code><nowiki>*</nowiki>}}</code>
| {{cn|<code><nowiki>*+</nowiki>}}</code>
|- valign="top"
| {{cn|<code><nowiki>?</nowiki>}}</code>
| {{cn|<code><nowiki>?+</nowiki>}}</code>
|- valign="top"
| {{cn|<code><nowiki>+</nowiki>}}</code>
| {{cn|<code><nowiki>++</nowiki>}}</code>
|- valign="top"
| {{cn|<code><nowiki>{</nowiki>''n''<nowiki>,}</nowiki>}}</code>
| {{cn|<code><nowiki>{</nowiki>''n''<nowiki>,}+</nowiki>}}</code>
|}
 
Рядок 309:
! Відповідність
|- valign="top"
| {{cn|<code><nowiki>ab(xa)*+a</nowiki>}}</code>
| {{cn|<code>{{Inverse|abxa'''a'''}}bxaa}}</code>; але не {{cn|<code>abxa{{Inverse|abxaa}}}}</code>, тому що літера {{cn|<code>'''a'''}}</code> уже зайнята
|}