假设我有一个字符串
喜欢 (20)
我想从此字符串中获取包含在圆括号中的子字符串(在上面的情况下为 20)。此子字符串可以在运行时动态更改。它可能是从 0 到无穷大的任何其他数字。为了实现这一点,我的想法是使用一个for
遍历整个字符串的循环,然后当(
存在 a 时,它开始将字符添加到另一个字符数组中,当)
遇到时,它停止添加字符并返回数组。但我认为这可能表现不佳。我对正则表达式知之甚少,那么是否有可用的正则表达式解决方案或任何可以有效地做到这一点的函数?
如果你不喜欢使用正则表达式,你可以使用Split:
string foo = "Likes (20)";
string[] arr = foo.Split(new char[]{ '(', ')' }, StringSplitOptions.None);
string count = arr[1];
Count = 20
无论括号中的数字如何,这都可以正常工作()
例如:
喜欢 (242535345)
会给:
242535345
const string likes = "Likes (20)";
int likesCount = int.Parse(likes.Substring(likes.IndexOf('(') + 1, (likes.Length - likes.IndexOf(')') + 1 )));
对于严格匹配,您可以执行以下操作:
Regex reg = new Regex(@"^Likes\((\d+)\)$");
Match m = reg.Match(yourstring);
这样,您将拥有所需的一切m.Groups[1].Value
。
正如 I4V 所建议的那样,假设您在整个字符串中只有该数字序列,如您的示例所示,您可以使用更简单的版本:
var res = Regex.Match(str,@"\d+")
在这个罐子里,你可以得到你正在寻找的价值res.Value
编辑
如果括号中的值不仅仅是数字,您可以将 \d 更改为[\w\d\s]
如果您想允许其中包含字母字符、数字和空格。
也适用于纯字符串方法:
string result = "Likes (20)";
int index = result.IndexOf('(');
if (index >= 0)
{
result = result.Substring(index + 1); // take part behind (
index = result.IndexOf(')');
if (index >= 0)
result = result.Remove(index); // remove part from )
}
当括号中的部分应该是数字时匹配;
string inputstring="Likes (20)"
Regex reg=new Regex(@"\((\d+)\)")
string num= reg.Match(inputstring).Groups[1].Value
说明:根据定义,正则表达式匹配子字符串,因此除非您另有说明,否则您要查找的字符串可以出现在字符串中的任何位置。
\d 代表数字。它将匹配任何单个数字。
我们希望它可能会重复几次,并且我们至少想要一次。+ 号是前一个符号或组重复 1 次或多次的正则表达式。
所以 \d+ 将匹配一个或多个数字。它将匹配 20。
为了确保我们得到 paranteses 中的数字,我们说它应该在 ( 和 ) 之间。这些是正则表达式中的特殊字符,因此我们需要对它们进行转义。
(\d+) 将匹配 (20),我们就快到了。
由于我们想要括号内的部分,而不包括括号,我们告诉正则表达式数字部分是一个单独的组。
我们通过在我们的正则表达式中使用括号来做到这一点。((\d+)) 仍然会匹配 (20),但现在它会注意到 20 是该匹配的子组,我们可以通过 Match.Groups[] 获取它。
对于括号中的任何字符串,事情都会变得有点困难。
Regex reg=new Regex(@"\((.+)\)")
适用于许多字符串。(点匹配任何字符)但是如果输入类似于“This is an example(parantesis1)(parantesis2)”,您将匹配 (parantesis1)(parantesis2) 与 parantesis1)(parantesis2 作为捕获的子组。这不太可能成为你所追求的。
解决方案可以是对“除右括号外的任何字符”进行匹配
Regex reg=new Regex(@"\(([^\(]+)\)")
这将找到 (parantesis1) 作为第一个匹配项,其中 parantesis1 为 .Groups[1]。
嵌套括号仍然会失败,但是由于正则表达式不是嵌套括号的正确工具,我觉得这种情况有点超出范围。
如果您知道字符串总是在组之前以“喜欢”开头,那么保存解决方案会更好。
即使使用 Linq:
var s = "Likes (20)";
var s1 = new string(s.SkipWhile(x => x != '(').Skip(1).TakeWhile(x => x != ')').ToArray());