Різниця між '.' , '?' та "*" у регулярних виразах?


21

Чи можу я отримати приклад того, як ці три елементи (називаються вони метахарактерами?) Відрізняються?

Я знаю, що це *означає все або нічого, але я не впевнений, чи правильно це думати. З іншого боку .і ?здаються такими ж. Вони відповідають одному персонажу, правда?



Відповіді:


16

Взято прямо з Вікіпедії :

? Знак питання вказує нуль або один вхід попереднього елемента. Наприклад, кольоровий колір відповідає як "кольоровому", так і "кольоровому".

*Зірочка вказує на нуль або більше випадків попереднього елемента. Наприклад, ab * c відповідає "ac", "abc", "abbc", "abbbc" тощо.

Велика різниця полягає в тому, що зірочка відповідає нулю або більше подій, тоді як знак питання відповідає нулю або одному події. Порівняйте ці два приклади:

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

Тому що в colouurбукві u (попередній елемент перед класифікатором ?) траплялося не один раз, вона не збігається з ?, але вона збігається з*

Подібний приклад:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

З тієї ж сторінки Вікіпедії:

Відповідає будь-якому одному символу (багато додатків виключають нові рядки, а саме те, які символи вважаються новими рядками, є специфічними для смаку, кодування символів та платформи, але можна припустити, що символ подавання рядків включений). У виразах дужок POSIX символ символу відповідає буквальній крапці. Наприклад, ac відповідає "abc" тощо, але [ac] відповідає лише "a", "." Або "c".

У нашому прикладі

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

Доречно, останній читає як match any line that has "colou", plus any character, plus letter "r"

Висновок

Ви запитували: "Я знаю, що" * "означає все або нічого, але я не впевнений, чи це правильний спосіб думати про це. З іншого боку". & '?' здаються такими ж ". Як бачимо, крапка і зірочка не зовсім однакові. Крапка діє на будь-якому символі, який може займати певну позицію, тоді як знак питання працює на попередньому елементі.


32

Ви можете плутати регулярні вирази з кулями оболонок

У регулярному виразі синтаксис .представляє будь-який окремий символ (зазвичай виключаючи символ нового рядка), в той час *як кількісний коефіцієнт, що означає нуль або більше попереднього атома регексу (символу або групи). ?являє собою квантор, що означає нуль або один екземпляр попереднього атома, або (у варіантах регулярних виразів, які його підтримують) модифікатор, який встановлює поведінку квантора на неагресивну.

У глобусах оболонки ?представлений один символ (наприклад, регулярний вираз .), в той час як *являє собою послідовність нуля або більше символів (еквівалентно регулярному вираженню .*).

Кілька посилань, які можуть вам стати корисними, є http://www.regular-expressions.info/quickstart.html та http://mywiki.wooledge.org/glob


6

Примітка. Examples provided are in Python.Хоча концепція залишається такою ж.

'.'є відповідним символом, який відповідає будь-якому символу, за винятком символу нової лінії (це теж може бути замінено re.DOTALLаргументом у Python). Звідси його ще називають Wildcard .

'*'є кількісним показником (визначає, як часто може виникати елемент). Короткий для {0,} .

Це означає "відповідати нулю або більше" - група, яка передує зірці, може виникати будь-яку кількість разів у тексті. Він може бути повністю відсутнім або повторюватися знову і знову.

'?'також є кількісним показником . Короткий для {0,1} .

Це означає "Зрівняти нуль або одну з групи, що передує цьому знаку питання". Він також може бути інтерпретований як частина, що передує знаку питання, необов'язкова .

наприклад:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

У наведеному вище прикладі "?" вказує на те, що дві цифри, що передують їй, є необов'язковими. Вони можуть не виникати або виникати не більше одного разу.

Різниця між '.' і "?":

'.'відповідає / приймає / перевіряє будь-який окремий символ для місця, яке він займає у звичайному виразі.

наприклад:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?'відповідає / перевіряє нуль або одиночне виникнення групи, що передує їй .

Перевірте приклад мобільного номера.

Те саме стосується '*'. Він перевірить нуль або більше випадків групи, що передує йому .

Поєднання:

'.*': Приймає скільки завгодно послідовностей. Жадібний підхід .

'.*?'Приймає першу відповідну послідовність і зупиняється. Нежадний підхід

Для отримання додаткової інформації розгляньте наступні два питання ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.