2014-02-03 2 views
0

Часть моей заявки требует, чтобы узнать о появлении «1p/sec» или «22p/sec» или «22p/sec» или ([00-99] p/сек также [00-99] р/сек) в строке.Регулярное выражение [0-99] p/sec

До сих пор я могу получить только первое вхождение (например, если его одна цифра, как и в приведенной выше строке). Я должен быть в состоянии получить 'п' число появления

Кто пл дать руководящие указания

string input = "US Canada calling @ 1p/ sec (Base Tariff - 11p/sec). Validity : 30 Days."; 

     // Here we call Regex.Match. 
     Match match = Regex.Match(input, @"(\d)[p/sec]", 
      RegexOptions.IgnorePatternWhitespace); 

    // input.IndexOf("p/sec"); 

     // Here we check the Match instance. 
     if (match.Success) 
     { 
      // Finally, we get the Group value and display it. 
      string key = match.Groups[1].Value; 

      Console.WriteLine(key); 
     } 
+0

Ваш вопрос не совсем ясен, но кажется, что вы хотите сказать '@" \ d {1,2} p/sec ". – devnull

+0

Или просто '@" \ d \ dp/sec "' – Jerry

+0

жаль об этом. Позвольте мне просто предоставить те данные, для которых он должен работать «1p/sec, 1p/sec, 93p/sec», также он должен иметь возможность находить более одного вхождения выражения в строке – user2040600

ответ

2

Вы должны количественно ваших \d в регулярном выражении, например, путем добавления + квантора, который затем будет вызывайте \d+, чтобы соответствовать хотя бы одному, но, возможно, и более цифрам. Чтобы ограничить определенное количество цифр, вы можете использовать квантор {n,m}, например. \d{1,2}, который затем будет соответствовать одной или двум цифрам.

Заметим также, что [p/sec], как вы используете его в регулярном выражении является класс символов, соответствующий одному символу из множества {c, e, p, s, /}, которая, вероятно, не то, что вы хотите, потому что вы бы хочу соответствовать p/secбуквально.

Более надежный вариант, вероятно, будет следующее

(\d+)\s*p\s*/\s*sec 

, который а) соответствует p/sec в буквальном смысле, а также позволяет пробельного между числом и блоком, а также вокруг /.

+0

Думаю, ему нужно соответствовать одному или двум (00-99). –

+0

Хотя они так говорят, я полагаю, что '+' - более безопасный выбор, потому что в противном случае они получат неправильный результат с вещами вроде 123p/sec. – Joey

+0

Если это должно совпадать, да, действительно. –

1

Использовать обычные

Match match = Regex.Match(input, @"(\d{1,2})p/sec" ... 

вместо этого.

\ d математика одна цифра. Если вы добавите {1,2} к этому, вы вместо этого сопоставите одну-две цифры. \ d * будет соответствовать нулю или больше, а \ d + соответствует одному или нескольким. \ d {1,10} будет соответствовать 1-10 цифрам.

Если вам нужно знать, если он был окружен скобками или вы не могли бы сделать

Match match = Regex.Match(input, @"(([\d{1,2}])|(\d{1,2}))p/sec" 
... 
bool hasBrackets = match.Groups[1].Value[0] == '['; 
+0

С помощью '@" (\ d { 1,2}) p/sec ", вы также получите частичное совпадение, например «12345p/sec» (группа будет содержать 45) – stema

+0

Да, это правда. Принятый ответ имеет ту же проблему. –

0

Как об этом регулярное выражение:

^\[?\d\d?\]?/\s*sec$ 

Объяснение:

The regular expression: 

^\[?\d\d?\]?/\s*sec$ 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
^      the beginning of the string 
---------------------------------------------------------------------- 
    \[?      '[' (optional (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    \d      digits (0-9) 
---------------------------------------------------------------------- 
    \d?      digits (0-9) (optional (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
    \]?      ']' (optional (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
/      '/' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 or 
          more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    sec      'sec' 
---------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string 
---------------------------------------------------------------------- 
0

Если я получить вас правильно, вы хотите найти все occurrances, верно?Используйте matchcollection

string input = "US Canada calling @ 1p/sec (Base Tariff - 11p/sec). Validity : 30 Days."; 

// Here we call Regex.Match. 
Regex regex = new Regex(@"(\d){1,2}[p/sec]", RegexOptions.IgnorePatternWhitespace); 
MatchCollection matchCollection = regex.Matches(input); 
// input.IndexOf("p/sec"); 

// Here we check the Match instance. 
foreach (Match match in matchCollection) 
{ 
    Console.WriteLine(match.Groups[0].Value); 
} 
0

Вы можете сделать это:

string input = "US Canada calling @ 1p/ sec (Base Tariff - 11p/sec). 91p/ sec , 123p/ sec Validity : 30 Days."; 

MatchCollection matches = Regex.Matches(input, @"\b(\d{1,2})p/\s?sec"); 

foreach (Match m in matches) { 
    string key = m.Groups[1].Value; 
    Console.WriteLine(key); 
} 

Выход:

\b является word boundary, чтобы привязать матч к началу «слова» (, обратите внимание, что он не будет соответствовать «123p/sec» в тестовой строке!)

\d{1,2} Будет соответствовать одной или двум цифрам. See Quantifiers

p/\s?sec буквальному "р/с" с дополнительным пробелом перед тем "сек"

0

Regex Expression:

((?<price>(\d+))p/sec)|(\[(?<price>(\d+[-]\d+))\]p/sec) 

В C# вам нужно запустить цикл для проверки нескольких захватов:

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