我正在尝试从以下字符串中获取int[]
。我最初做了一个Regex().Split()
,但正如你所看到的,没有明确的方法来分割这个字符串。我可以分开[a-z]
,但之后我必须删除逗号。现在已经很晚了,我想不出一个很好的办法。
"21,false,false,25,false,false,27,false,false,false,false,false,false,false,false"
有什么建议吗?
答案 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;
}
}