我申请的一部分需要找出“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);
}
答案 0 :(得分:2)
您需要在正则表达式中量化 \d
,例如添加+
量词,然后\d+
至少匹配一个{n,m}
但可能更多数字。要限制为特定的位数,您可以使用\d{1,2}
量词,例如[p/sec]
,然后匹配一个或两个数字。
另请注意,在正则表达式中使用它时c
是一个字符类,匹配集{e
,p
,s
,{中的单个字符{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);
}
}