Лучшие регулярного выражения для одного или двух значений дополнительно разделена по определенным характером


Я ищу самое краткое выражение, которое соответствует одному или двум 4-значное лет на следующие сетапы:

  • год
  • -год
  • -год
  • год-год

Я не могу придумать ничего круче, чем это:

[\\-]?\d{4}|\d{4}\[\\-](\d{4})?


231
2
задан 4 ноября 2011 в 12:11 Источник Поделиться
Комментарии
3 ответа

Я предполагаю, что вы предпочли самый длинный матч. То есть, если строка ввода:

xyzzy 2000-2010 xyzzy

затем комбинационной 2000 или 2010 или 2000- или -2010 - это не то, что вы хотите, даже если эти будут действительны соответствует тому, как вы изложили проблему.

В Perl 5.10 и выше, можно уменьшить выкройку до 20 символов:

(\d{4})-(?1)?|-?(?1)

Давайте разорвать этот вниз.

(\d{4}) # match a year and capture the pattern
- # match a hyphen
(?1)? # match a year again if possible
| # OR,
-? # match an initial hyphen if possible
(?1) # match a year

Вещи становятся более сложными, если вы предпочитаете, чтобы соответствовать два года даже в таких случаях, как:

xyzzy -2000-2010 xyzzy

См.: http://perldoc.perl.org/perlretut.html#Recursive-patterns

2
ответ дан 7 ноября 2011 в 11:11 Источник Поделиться

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

3
ответ дан 4 ноября 2011 в 12:11 Источник Поделиться

Если сначала все сняли "-" символы, которые вы могли бы сделать это

(\d{4}){1,2}

или

(\d{4}|\d{8})

1
ответ дан 4 ноября 2011 в 12:11 Источник Поделиться