有人可以用一些正则表达式来帮助我吗?

时间:2011-06-29 04:42:39

标签: c# regex arrays

我正在尝试从以下字符串中获取int[]。我最初做了一个Regex().Split(),但正如你所看到的,没有明确的方法来分割这个字符串。我可以分开[a-z],但之后我必须删除逗号。现在已经很晚了,我想不出一个很好的办法。

"21,false,false,25,false,false,27,false,false,false,false,false,false,false,false"

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

拆分如下:

[^\d]+

如果你的字符串不以数字结尾,如果你的字符串不是以数字和/或末尾的空元素开头,那么你可能会在开头得到一个空元素。如果发生这种情况,您可以修剪这些元素更好的是,如果Regex().Split()支持某种标志不返回空字符串,请使用它。

答案 1 :(得分:0)

这里的一个简单解决方案是将字符串与模式\d+匹配。 有时按照您不想匹配的值进行拆分更容易,但在这里它可以作为反模式。:

MatchCollection numbers = Regex.Matches(s, @"\d+");

另一种解决方案是使用常规的String.Split和一些LINQ魔术。首先我们用逗号分隔,然后检查给定标记中的所有字母是否为数字:

var numbers = s.Split(',').Where(word => word.All(Char.IsDigit));

.Net中的\d匹配所有Unicode数字,而不仅仅是[0-9](在数组中尝试123,只是为了好玩),这是一个经常被忽视的事实。更强大的解决方案是尝试根据您定义的文化解析每个标记,并返回有效数字。这可以很容易地适应支持小数,指数或种族数字格式:

static IEnumerable<int> GetIntegers(string s)
{
    CultureInfo culture = CultureInfo.InvariantCulture;
    string[] tokens = s.Split(',');
    foreach (string token in tokens)
    {
        int number;
        if (Int32.TryParse(token, NumberStyles.Integer, culture, out number))
            yield return number;
    }
}