Чому регулярний вираз відповідає від 1 до 10, написаним як [1-9] | 10, а не [1-10]?

Чому регулярні вирази відповідають числам від 1 до 10, як правило, написані наступним чином?

[1-9]|10

Замість:

[1-10]

Або це:

[1-(10)]
12
[1-10] відповідає 1 або 0 і нічого іншого.
додано Автор Damien_The_Unbeliever, джерело
Це стосується діапазону символу , а не діапазону номера . В основному ви читаєте його як число, але regex читає його як простий характер.
додано Автор HamZa, джерело

10 Відповіді

Іноді хороший малюнок вартістю 1000 слів ...

Ось три пропозиції у вашому питанні і те, як їх розуміє вигляд regex:

[1-9] | 10

Regular expression image

[1-10]

Regular expression image

[1- (10)]

Invalid regexp !!

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

Діапазон, як правило, пов'язаний з цифрами з обох сторін або з обох сторін.

19
додано
@Baumr Див. Моє оновлення
додано Автор Stephan, джерело
@Stephan також, діапазон в останньому регулярному виразі не є недійсним, оскільки другий символ не є цифрою, це тому, що індекс ASCII/unicode ( нижче, ніж 1 і не можна вказувати діапазони в порядку зменшення індексів.
додано Автор Patrick Roberts, джерело
Спасибі, дивовижно - чому останній недійсний? Дужки добре працюють у регулярному виразі Google Analytics
додано Автор Baumr, джерело
Я знаю, що це 4 роки, але виправлення деяких відомостей: 10 | [1-9] має більш високу ймовірність, що деякі версії регулярних виразів оцінюють оператори OR у порядку і відповідають першому правильному результату тому значення 10 може відображати лише 1 10 , а не ціле число.
додано Автор Bullfrog, джерело

Це тому, що регреси працюють з символами, а не з числами. [1-9] еквівалентно (?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9) у той час як [1- 10] (?: 1 | 0) (тому що це діапазон 1–1 та цифра 0).

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

19
додано
@Baumr: Тому що це все одно буде враховувати окремі символи і таким чином намагатиметься (і не вдасться) створити діапазон символів з 1- ().
додано Автор Joey, джерело
Дякуємо за відповідь! Якщо у вас є момент, не могли б ви також пояснити, чому [1- (10)] не працюватиме?
додано Автор Baumr, джерело
Оскільки regex не розпізнає номери, він розпізнає цифри та символи. Таким чином, навіть якщо ми, як люди, визнаємо, що 10 є числом після 9, regex не має поняття про це; про це знають цифри від 0 до 9. Таким чином, '10' не є числом в регулярному виразі, це послідовність цифр, що складається з двох цифр 1 і 0.
додано Автор Erik J. Olson, джерело
[1-9]|10

У цьому:

  • [1-9] accepts any character from 1 through 9;
  • | performs an "or" operation;
  • 10 accepts the 10 literally.
[1-10]

Це приймає:

  • будь-який окремий символ від 1 до 1,
  • або 0 .
6
додано
Це було дуже брудно. Тепер це не так.
додано Автор Lightness Races in Orbit, джерело
Дякуємо за виправлення моєї помилки;)
додано Автор Lightness Races in Orbit, джерело
Дякуємо за форматування та покращену читабельність
додано Автор JoseTeixeira, джерело

Незалежно від того, який зразок знаходиться всередині [...] (клас символів), він відповідає лише символу single .

Як оператор діапазону ( - ) всередині класу символів працює, він приймає один символ як лівий операнд, а один символ як правий операнд, потім розгортає його до списку символів.

Отже, розглядаючи діапазони в прикладах

  • 1-9 (1 to 9) in [1-9]|10 (equivalent to [123456789]|10)
  • 1-1 (1 to 1) in [1-10] (equivalent to [10] which is the same as [01])
  • 1-( (1 to opening parenthesis) in [1-(10)]
    • I actually get an error with this in Perl because the range 1 to ( doesn't really make sense.
3
додано
Цікаво, спасибі! Правда, я написав цю останню без тестування: P
додано Автор Baumr, джерело
\[([1-9][0-9]|[0-9])\]

Це видалить посилання Вікіпедії, коли ви копіюєте щось для вашого проекту.

2
додано

Існує еквівалент регулярного виразу [1-9]

[123456789]

regex клас символів , який відповідає одному символу. Якщо в його визначенні буде тире, як у бути , клас розширюється, щоб включати цілі (тобто b і e ), а також всі символи з кодами між двома кінцями (тобто c та d ). Обидва кінці можуть бути однаковими, як у 1-1 , у такому випадку вираз еквівалентний 1 .

Ось чому [1-10] функціонально еквівалентний 0 | 1 .

1
додано

Це основне визначення класу символів. [1-10] означає "відповідає будь-якому символу в діапазоні від 1 до 1 або 0". Класи символів оцінюються символом за символом (за винятком послідовностей виходу та - ); вони не розуміють числа.

0
додано

Це відбувається тому, що символи [] являють собою набір символів, наприклад [0-5] збігу 0-5. Тим не менш, 10 має дві цифри і тому [0-9] не дасть точної відповідності (буде відповідати тільки першій цифрі, '1' від '10'.

Символ труби | можна розглядати як оператор "або".

0
додано
Це більше схоже на оператора "або". "і" означає, що ви повинні відповідати обом одночасно, що насправді не може відбутися.
додано Автор BoltClock, джерело
Моє ліжко. Я виправлюся.
додано Автор Terry, джерело
"або" оператор, а не "і".
додано Автор Sebastian Redl, джерело

Мова йде про відповідність символів. Коли ви говорите [1-9] , це означає, що він відповідає будь-якому окремому символу від 1 до 9. Номер 10 буде розглядатися як 2 окремих символи.

0
додано

[] вказує на відповідність одного символу

for example [ab] would match either a or b

so [1-9] which is effectively shorthand for [123456789] would match a single character that is one of the digits from 1 to 9

Ваш приклад [1-10] розширить 1-1, щоб позначити всі символи в діапазоні 1 до 1 (тобто 1 ), щоб фактичний регулярний вираз розширився до [10] (тобто або символ 1, або символ 0)

0
додано