2010-11-11 2 views
-3

Мне нужно разобрать строку, которая выглядит, как в примере ниже:слишком жадная Regex проблемы

Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9].*) [A-Z]"); 
var match = TitleRegex.Match("Chapter - 1 The Brown Fox"); 
Console.WriteLine(match.Groups[1].Value); 

То, что я хочу, чтобы извлечь номер. Проблема заключается в том, что выход 1 The Brown вместо простого 1.
Я не понимаю, почему буквы также включены в числовой ([0-9]).

Любые предложения?

ответ

3
Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9]{1,2}) [A-Z]"); 

Вы захватывая ., который обычно является матч все, кроме новых линий. Я положил квантор {1,2}, то есть он будет соответствовать 0-99. Измените это в соответствии с вашими требованиями (или вы можете просто оставить его как 0 или более*).

Не могли бы вы также использовать \d вместо [0-9]. Сокращение, как правило, хорошо :)

+0

Спасибо! Это была глупая ошибка с копией. Я сломал себе голову вокруг этого%) – levanovd

1

Ответ заключается в том, что вы, по-видимому, неправильно используете кванторы;

[0-9].* 

Этот частичный шаблон соответствует какой-либо одной цифры (0-9) один раз, а затем также любой символ на всех (.) 0 или более раз (*)

Удалить точки перед звездочками ,

[0-9]* 
2

буквы включены, потому что вы просили за них, когда вы добавили .* к группе захвата. Попробуйте просто ([0-9]+) или лучше (\d+)

0

Изменить на:

"[A-Z].* - ([0-9]?) [A-Z]" 

При использовании [0-9].* он ищет один номер плюс 0 или много символов, используя [0-9]+ дает один или несколько целых чисел на этом конкретном месте. Если вы уверены, что не будет больше, чем скажем 3 целых числа, чтобы вы могли использовать [0-9]{1,3} или столько, сколько хотите 4,5 и т. Д.

Смежные вопросы