Можно ли отрицать группу в регулярном выражении? - PullRequest
1 голос
/ 02 марта 2020

Допустим, у нас есть этот текст:

2020-09-29
2020-09-30
2020-10-01
2020-10-02
2020-10-12
2020-10-16
2020-11-12
2020-11-23
2020-11-15
2020-12-01
2020-12-11
2020-12-30

Я хочу сделать что-то вроде этого: \ d \ d \ d \ d- (NOT10) - (30)

Итак, я хочу получить все даты любого года, но не 10-го месяца, и важно, чтобы этот день был 30.

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

Ответы [ 3 ]

3 голосов
/ 02 марта 2020

Вы можете использовать отрицательные взгляды :

\d\d\d\d-(?!10)\d\d-30

Деталь (?!10) гарантирует, что в точке, где она вставлена ​​в регулярное выражение, нет 10. Обратите внимание, что после этого вам все равно нужно сопоставлять следующие цифры, таким образом, часть \d\d.

Вообще говоря, вы не можете (насколько мне известно) отрицать часть, которая затем также соответствует частям строки. Но с негативными взглядами вы можете смоделировать это, как я делал выше. Обобщенная идея выглядит примерно так:

(?!<special-exclusion-pattern>)<general-inclusion-pattern>

Где шаблон специального исключения соответствует подмножеству шаблона общего включения. В приведенном выше случае общий шаблон включения равен \d\d, а специальный шаблон исключения ins 10.

.
1 голос
/ 02 марта 2020

Попробуйте:

/20\d{2}-(?:0[1-9]|1[12])-30/

Объяснение:

20 \ d {2} будет соответствовать 20XX

(?: 0 [1-9] | 1 [12]) будет соответствовать 0X или 11, 12

30 будет соответствовать 30

Демонстрация: https://regex101.com/r/O2F1eV/1

0 голосов
/ 02 марта 2020

Проще всего преобразовать подстроку (если она есть), которая соответствует /^\d{4}-10-30$/, в пустую строку, а затем разбить полученную строку на одну или несколько строк новой строки.

Если ваша строка была

2020-10-16
2020-10-30
2020-11-12
2020-11-23

и удерживается переменной str, затем в Ruby, например,

str.sub(/^\d{4}-10-30$/,'')
  #=> "2020-10-16\n\n2020-11-12\n2020-11-23\n"

, поэтому

str.sub(/^\d{4}-10-30$/,'').split
  #=> ["2020-10-16", "2020-11-12", "2020-11-23"]

Какой бы язык вы ни использовали, несомненно, имеет аналог методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...