从使用某个指定字符包含的字符串中获取子字符串

时间:2013-09-05 08:29:36

标签: c# .net regex string substring

假设我有一个字符串

  

喜欢(20)

我想从这个字符串中获取括在圆括号中的子字符串(在上面的例子中是20)。该子字符串可以在运行时动态更改。它可能是从0到无穷大的任何其他数字。为了实现这一点,我的想法是使用遍历整个字符串的for循环,然后当存在(时,它开始将字符添加到另一个字符数组,并在遇到)时,它停止添加字符并返回数组。但我认为这可能表现不佳。我对正则表达式知之甚少,那么是否有可用的正则表达式解决方案或任何能够以有效方式完成此任务的函数?

6 个答案:

答案 0 :(得分:6)

如果您不喜欢使用正则表达式,可以使用Split

string foo = "Likes (20)";
string[] arr = foo.Split(new char[]{ '(', ')' }, StringSplitOptions.None);
string count = arr[1];

Count = 20

无论括号()

中的数字如何,这都可以正常使用

e.g:

  

喜欢(242535345)

会给:

  

242535345

答案 1 :(得分:1)

const string likes = "Likes (20)";
int likesCount = int.Parse(likes.Substring(likes.IndexOf('(') + 1, (likes.Length - likes.IndexOf(')') + 1 )));

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

获取您要查找的值

修改

如果括在括号中的值不仅仅是数字,如果你想允许字母字符,数字和空格,你可以用[\w\d\s]来改变\ d。

答案 3 :(得分:1)

也适用于纯字符串方法:

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

Demo

答案 4 :(得分:1)

当paranthesis中的部分应该是数字时匹配;

string inputstring="Likes (20)"
Regex reg=new Regex(@"\((\d+)\)")
string num= reg.Match(inputstring).Groups[1].Value

说明: 根据定义,regexp匹配子字符串,因此除非您另外指明,否则您要查找的字符串可能出现在字符串中的任何位置。

\ d代表数字。它将匹配任何一位数。

我们希望它可能重复多次,我们至少需要一次。 +符号是前一个符号或组重复1次或更多次的正则表达式。

所以\ d +将匹配一个或多个数字。它将匹配20.

为了确保我们得到paranteses中的数字,我们说它应该在(和)之间。这些是regexp中的特殊字符,因此我们需要将它们转义。

(\ d +)会匹配(20),我们几乎就在那里。

由于我们希望parantheses中的部分,而不包括parantheses,我们告诉regexp数字部分是一个单独的组。

我们通过在正则表达式中使用parantheses来做到这一点。 ((\ d +))仍将匹配(20),但现在它会注意到20是此匹配的子组,我们可以通过Match.Groups []获取它。

对于parantheses中的任何字符串,事情会变得更加困难。

Regex reg=new Regex(@"\((.+)\)")

适用于许多字符串。 (点匹配任何字符)但是如果输入类似于“这是一个例子(parantesis1)(parantesis2)”,你将匹配(parantesis1)(parantesis2)和parantesis1)(parantesis2作为捕获的子组。这不太可能是你的追求。

解决办法可以是对“任何一个角色进行关闭的修复”进行匹配

Regex reg=new Regex(@"\(([^\(]+)\)")

这将找到(parantesis1)作为第一个匹配,parantesis1为.Groups [1]。

嵌套的paranthesis仍然会失败,但由于正则表达式不是嵌套paranthesis的正确工具,我觉得这种情况有点超出了范围。

如果您知道该字符串始终以“Likes”开头,那么保存解决方案会更好。

答案 5 :(得分:1)

即使是Linq:

var s = "Likes (20)";
var s1 = new string(s.SkipWhile(x => x != '(').Skip(1).TakeWhile(x => x != ')').ToArray());