C# 如何从用户提供的字符串中解析整数
我有一个规范,用户需要输入一组坐标,如:C# 如何从用户提供的字符串中解析整数,c#,string,parsing,C#,String,Parsing,我有一个规范,用户需要输入一组坐标,如: {{2,3}, {9,0}} 这些是二维轴上直线的坐标 我想在运行时在C#中动态解析这个用户输入字符串,并在二维数组中输入这些坐标。我知道我们可以做硬编码: int[,] CoOrdinates = {{2,3}, {9,0}}; 但是我不知道如何让用户输入一个字符串,并从字符串中获取坐标以动态存储在数组中 我正在使用Console.Readline();让用户输入坐标 请帮忙,谢谢 我将使用正则表达式(C#中的类)解析出所需字符串的位,然后Int3
{{2,3}, {9,0}}
这些是二维轴上直线的坐标
我想在运行时在C#中动态解析这个用户输入字符串,并在二维数组中输入这些坐标。我知道我们可以做硬编码:
int[,] CoOrdinates = {{2,3}, {9,0}};
但是我不知道如何让用户输入一个字符串,并从字符串中获取坐标以动态存储在数组中
我正在使用Console.Readline();让用户输入坐标
请帮忙,谢谢 我将使用正则表达式(C#中的类)解析出所需字符串的位,然后
Int32.TryParse()
将字符串转换为数字。是构造正则表达式的好资源,也是我首选的正则表达式测试工具。祝你好运。string s=“{2,3},{9,0}”;
string s = "{{2,3}, {9,0}}";
string p = "{(?<x>\\d),(?<y>\\d)}";
Regex regex = new Regex(p);
MatchCollection ms = regex.Matches(s);
int[,] cood = new int[ms.Count, ms.Count];
int i =0;
foreach (Match m in ms)
{
cood[i,0] = int.Parse(m.Groups["x"].Value);
cood[i, 1] = int.Parse(m.Groups["y"].Value);
i++;
}
字符串p=“{(?\\d),(?\\d)}”;
正则表达式正则表达式=新正则表达式(p);
MatchCollection ms=regex.Matches;
int[,]cood=新int[ms.Count,ms.Count];
int i=0;
foreach(匹配m,毫秒)
{
cood[i,0]=int.Parse(m.Groups[“x”].Value);
cood[i,1]=int.Parse(m.Groups[“y”].Value);
i++;
}
如果坐标中的值不正确,则可以使用TryParse快速回答:
public void IntegerReader()
{
string integers = Console.ReadLine();
string[] split = integers.Split(',');
int result;
foreach (string s in split)
{
if (!string.IsNullOrEmpty(s.Trim()))
if (int.TryParse(s.Trim(), out result))
Console.WriteLine(result);
}
}
这不是非常优雅,但我认为结果是你所期望的
string coords = "{{2,3}, {9,0}}";
string matchPattern = @"\{\{(?<x1>\d{1})\,(?<y1>\d{1})\}\,\s*\{(?<x2>\d{1})\,(?<y2>\d{1})\}\}";
var matches = Regex.Match(coords, matchPattern);
int[,] values = new int[2,2];
int.TryParse(matches.Groups["x1"].ToString(), out values[0,0]);
int.TryParse(matches.Groups["y1"].ToString(), out values[0,1]);
int.TryParse(matches.Groups["x2"].ToString(), out values[1,0]);
int.TryParse(matches.Groups["y2"].ToString(), out values[1,1]);
/* Result:
* 0 1
* -----
* 0| 2 3
* 1| 9 0
*/
string-coords=“{2,3},{9,0}”;
字符串匹配模式=@“{{(?\d{1})\,(?\d{1})\}\,\s*{(?\d{1})\,(?\d{1})\}”;
var matches=Regex.Match(坐标、匹配模式);
int[,]值=新的int[2,2];
int.TryParse(匹配.Groups[“x1”].ToString(),out值[0,0]);
int.TryParse(匹配.Groups[“y1”].ToString(),out值[0,1]);
int.TryParse(匹配.Groups[“x2”].ToString(),out值[1,0]);
int.TryParse(匹配.Groups[“y2”].ToString(),out值[1,1]);
/*结果:
* 0 1
* -----
* 0| 2 3
* 1| 9 0
*/
当然,在将值分配给矩形数组之前,您需要检查是否返回了四个组,但这应该很容易实现。您可能需要使用System.Drawing.Point结构,它基本上是x,ypairs@Oded,因为字符串是数组,我试图从它们的位置提取字符,如:“string inputCoOds=Console.ReadLine();int CoOd1X=int.Parse(inputCoOds[2].ToString());int CoOd1Y=int.Parse(inputCoOds[4].ToString());`这有点难看,不通用,所以我想要一个更优雅的解决方案。我会用
TryParse
来代替。@Daniel同意,TryParse
更可取。@jlafay您在控制台应用程序中试过吗?否则,它将给出一个异常,因为integers从Console获取其值。ReadLine()我尝试了一个具有OP指定的指定坐标格式的字符串。你试过了吗?我想也许你的拆分不起作用。正如我在回答中所说的,我只是用逗号作为分隔符快速地给出了一个。只是为了让他有个主意。他可以在Split menthod中更改分隔符列表,以包括他想要的所有分隔符。