/ / Як виключити певне двоцифрове число (трапляється "12")? - регекс, google-analytics

Як виключити певне двоцифрове число (трапляється "12")? - регекс, google-analytics

Це, до речі, підсумок Google Analytics.

Я хочу виключити число "8" і число "12" (дванадцять) зі співпадіння.

Це найкраще, що я міг придумати поки що, але це не правильно:

[^((12)|8)]

За даними regexpal.com, це все ще виключає 1, 2 та 8 — а не 12 та 8.

EDIT: Щоб відповісти на коментарі нижче мого питання,дані завжди будуть у вигляді одно- або двоцифрового числа (наприклад, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ..., 99). Однозначно не критично, що вираз буде фільтруватися лише для чисел, оскільки я ніколи не очікував би побачити будь-який інший тип даних, окрім цього, що йде в цю сферу.

Відповіді:

1 для відповіді № 1

Для відповідності будь-якому числу (цілому), окрім 8 і 12, можливий шаблон:

[02-79][0-9]*|8[0-9]+|1([013-9][0-9]*|2[0-9]+)?

(Зауважте, що це не найкоротше, але альтернативи сортуються за ймовірністю.)

Але якщо ви використовуєте цей візерунок один із рядком, який містить 12, він матиме успіх, узгоджуючи лише 1 (або 2). Щоб вирішити проблему, ваш шаблон повинен бути прикріплений.

Якорі

Дві можливості:

1) Ви перевіряєте, чи є цілий рядок числом:

У цьому випадку ви можете завершити свій вираз, використовуючи початок і кінець рядкових якорів:

^([02-79][0-9]*|8[0-9]+|1([013-9][0-9]*|2[0-9]+)?)$

2) Ви тестуєте, чи рядок містить число:

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

([^0-9]|^)([02-79][0-9]*|8[0-9]+|1([013-9][0-9]*|2[0-9]+)?)([^0-9]|$)

де [^0-9]|^ означає символ, який не є цифрою або початком рядка. (те саме для кінця)


2 для відповіді № 2

Давайте подивимося, що ви намагаєтеся зробити за допомогою регулярного виразу [^((12)|8)]. Ось ви заявили всередину клас персонажа матч нічого, крім ( ) | 1 2 8. Тож кожен екземпляр цих символів буде відкинутий.

Результат [^((12)|8)]


Щоб не відповідати 12 і 8 вам доведеться вказати, що ви хочете відповідати.

Регулярні висвітлення: b([02-9][0-9]|[0-9][013-9]|[0-79])b

Пояснення:

  • b з обох сторін встановіть межу слова, щоб відповідати лише числам.

  • [02-9][0-9] відповідає всім числам, крім 1 передує 2 тобто 12.

  • [0-9][013-9] відповідає всім числам, крім 2 досягла успіху 1 тобто 12

  • [0-79] відповідає всім числам, крім 8.

  • | зміна, яка використовується для узгодження будь-якого з випадків.

Regex101 Demo