我有一个字符串
string str = "2952885619_Table!$1$4";
我想提取值1和4.
我试过
int index =str.IndexOf('$');
if (index > 0)
{
int rowIndex = Convert.ToInt32(string.Substring(index, index + 1));
int colIndex = Convert.ToInt32(BookmrkID.Substring(index, index + 3));
}
但它会抛出一个System.ArgumentOutOfRangeException
,我不知道为什么。
还有其他方法可以提取这两个值吗?
答案 0 :(得分:2)
您可以从$
开始使用string.Substring
和string.IndexOf
来获取字符串,然后您可以在$
上拆分字符串并删除空条目。这会将1
和4
作为字符串值,稍后您可以将它们解析为int
,如:
List<int> list = str.Substring(str.IndexOf('$'))
.Split(new[] { '$' }, StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToList();
您的list
将包含1
和4
作为整数值。
答案 1 :(得分:1)
这是你可以做到的另一种方式:
var splits = str.Split('$');
var rowIndex = splits[1];
var colIndex = splits[2];
答案 2 :(得分:0)
string.Substring调用的第二个参数是长度而不是结束范围。您必须计算项目在字符串中的位置差异:
if (index > 0){
int rowIndex = Convert.ToInt32(string.Substring(index, 1));
int colIndex = Convert.ToInt32(BookmrkID.Substring(index + 2, 1));
}
Doc:http://msdn.microsoft.com/en-us/library/aka44szs(v=vs.110).aspx
答案 3 :(得分:0)
只要您知道只有一个数字,您需要将子字符串的长度(第二个参数)设置为1:
int rowIndex = Convert.ToInt32(str.Substring(index + 1, 1));
int colIndex = Convert.ToInt32(str.Substring(index + 3, 1));
如果您不知道数字位数,则需要做更多工作:
int index1 = str.IndexOf('$');
if (index1 > 0) {
int index2 = str.IndexOf('$', index1 + 1);
if (index2 > 0) {
int rowIndex = Convert.ToInt32(str.Substring(index1 + 1, index2 - index1 - 1));
int colIndex = Convert.ToInt32(str.Substring(index2 + 1, str.Length - index2 - 1));
}
}
当然,其他人发布的策略也会有效。
答案 4 :(得分:0)
这里你命名你的变量
string str = "2952885619_Table!$1$4";
在这里你可以在变量string和bookmrkID上调用函数substring
Convert.ToInt32(string.Substring(index, index + 1));
试
int rowIndex = Convert.ToInt32(str.Substring(index,1));
答案 5 :(得分:0)
overload of string.Substring
that takes two arguments描述了它的第二个参数如下:
长度
输入:System.Int32
子字符串中的字符数。
您分别为第二个参数传递了index + 1
和index + 3
,而这两次都应该1
{看到1
和{{ 1}} 长度为1个字符。)
答案 6 :(得分:0)
第1步:您可以使用String.Split()
功能根据$
分隔符拆分字符串。
第2步:您只需忽略分割字符串的第一部分。
试试这个:
string str = "2952885619_Table!$1$4";
var items = str.Split('$');
var item1 = Convert.ToInt32(items[1]);
var item2 = Convert.ToInt32(items[2]);
答案 7 :(得分:0)
你可以选择第一个和最后一个$
,只读一个字符(如果数字总是一个字符)
string str = "2952885619_Table!$1$4";
var first = str.IndexOf("$");
var last = str.LastIndexOf("$");
Console.WriteLine(str.Substring(first+1,1));
Console.WriteLine(str.Substring(last+1,1));
实例:http://rextester.com/LOIXZ71902
或者,如果它们的长度可变,则会变得非常复杂:
string str = "2952885619_Table!$1234$4321";
var first = str.IndexOf("$");
var last = str.LastIndexOf("$");
Console.WriteLine(str.Substring(first+1,last-(first+1)));
Console.WriteLine(str.Substring(last+1));
答案 8 :(得分:0)
你可以试试这个:
var list = str.Split('$');
int rowIndex = int.Parse(list[1]);
int columnIndex = int.Parse(list[2]);
答案 9 :(得分:0)
这是另一个单线程,即使字符串不包含$
也是安全的:
string[] values = str.Substring(str.IndexOf('$') + 1).Split('$');
将它们转换为int[]
的最快方式(无需验证):
int[] intValues = Array.ConvertAll(values, int.Parse);
验证:
int i;
int[] intValues = values
.Where(v => int.TryParse(v, out i))
.Select(v => i)
.ToArray();
答案 10 :(得分:0)
如果您尝试匹配模式(您似乎是这样),您可以使用RegEx轻松解决此问题。
下面的单元测试(NUunit)找到模式美元符号+数字+美元符号+数字。得到所有匹配的结果,并在括号中包含数字部分 \ d + ,您可以在结果参数中提供的集合中访问它们#34;匹配&#34;。
有关RegEx的更多信息:Regular Expression Language - Quick Reference
希望这有帮助!
[Test]
public void Find_index_in_string()
{
// Arrange
const string str = "2952885619_Table!$1$4";
// Act
var matches = Regex.Matches(str, @"\$(\d+)\$(\d+)");
// Assert
Assert.That(matches.Count, Is.EqualTo(1));
Assert.That(matches[0].Groups[0].ToString(), Is.EqualTo("$1$4"));
Assert.That(matches[0].Groups[1].ToString(), Is.EqualTo("1")); // Extracted index 1
Assert.That(matches[0].Groups[2].ToString(), Is.EqualTo("4")); // Extracted index 2
}