正则表达式[0-99] p / sec

时间:2014-02-03 08:46:27

标签: c# regex

我申请的一部分需要找出“1p / sec”或“22p / sec”或“22p / sec”或([00-99] p / sec也是[00-99] p /的出现次数。 sec)字符串。

到目前为止,我只能获得第一次出现(即如果它是一个数字,就像上面字符串中的数字一样)。我应该能够得到“n”次出现次数

有人提供指导

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);
        }

6 个答案:

答案 0 :(得分:2)

您需要在正则表达式中量化 \d,例如添加+量词,然后\d+至少匹配一个{n,m}但可能更多数字。要限制为特定的位数,您可以使用\d{1,2}量词,例如[p/sec],然后匹配一个或两个数字。

另请注意,在正则表达式中使用它时c是一个字符类,匹配集{eps,{中的单个字符{1}},/},这可能不是您想要的,因为您希望与p/sec 字面匹配

更强大的选项可能是以下

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

其中a)按字面匹配p/sec,并且还允许数字和单位之间以及/周围的空格。

答案 1 :(得分: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] == '[';

答案 2 :(得分: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
----------------------------------------------------------------------

答案 3 :(得分:0)

如果我找对你,你想找到所有的出现,对吧?使用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);
}

答案 4 :(得分: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);
}

输出:

  

1
  11个
  91

\b是一个word boundary,用于将匹配锚定到“单词”的开头(注意它与测试字符串中的“123p / sec”不匹配!< /强>)

\d{1,2}将匹配一位或两位数字。 See Quantifiers

p/\s?sec匹配文字“p / sec”与“sec”之前的可选空格

答案 5 :(得分:0)

正则表达式:

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

在C#中,您需要运行for循环来检查多个捕获:

if(match.Success)
{
   for(int i = 0; i< match.Groups["price"].Captures.Count;i++)
   {
            string key = match.Groups["price"].Value;

            Console.WriteLine(key);
   }
}