2011-01-18 3 views
1

Скажите, есть ли у меня исходная строка, которая может содержать целое или двойное число, за которым следует временная шкала. Например, это может быть 5,5 часа или 30 минут и т. Д. Данные, которые я получаю в этом формате, как правило, не имеют формы, поэтому, например, я мог бы получить такие данные, как 5,5 часа. С добавленной полной остановкой.C# Регулярные выражения

Мне нужен способ извлечь целое или двойное число из таких строк, однако я борюсь с возможным включением дополнительных полных остановок/периодов. Я могу легко изолировать числа и стоп-стопы, заменив буквы emptyspace.

Может кто-нибудь проконсультироваться.

Спасибо.

+0

Вы действительно только хотите, чтобы извлечь номера или же временные рамки после номера? Существует ли ограничение на действительную временную шкалу, т.е. е. список, на который нужно проверить? –

+0

Я проверяю шкалу времени, основанную на сравнении с предопределенными значениями, которые я закодировал в программе. Просто используя string.contains(). –

ответ

3
\d+(?:\.\d+)? 

должен соответствовать вашим критериям:

\d+ # Match one or more digits 
(?: # Try to match the following group: 
\. # a dot 
\d+ # one or more digits 
)? # End of optional group 

Таким образом, чтобы перебрать все матчи в строке:

Regex regexObj = new Regex(@"\d+(?:\.\d+)?"); 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    // matched number: matchResults.Value 
    matchResults = matchResults.NextMatch(); 
} 

Это регулярное выражение не будет соответствовать число в экспоненциальной нотации как 1.05E-6, очевидно, ,

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

(\d+(?:\.\d+)?)\s*(\w+) 

Теперь, после матча, matchResults.Groups[1] будет содержать число. matchResults.Groups[2] будет содержать слово, следующее за номером, который вы можете проверить против списка допустимых слов. Это слово является обязательным, т.е. е. если он отсутствует, все регулярное выражение не удастся - если вы этого не хотите, добавьте ? в конец.

+0

Отлично, это работает отлично. Спасибо. –

1

Используйте (названные) группы, чтобы извлечь информацию вам нужно:

(?'val'\d+\.?\d*).*? 

или: ('Вал' \ d + \ d *?.?) \ Ш +.? должен выполнить работу, и вы найдете результаты в названной группе «val».

+1

'. *?' Всегда будет соответствовать пустой строке. –

+0

Исправить. заменяя \ w + \.? должны улучшиться. –

1

Может быть что-то вроде этого:

@"\b(\d+(?:\.\d+)?)\s+(?:hours|mins|seconds)\b" 
Смежные вопросы