我有代码:
class Program {
static void Main(string[] args) {
const string f = "../../../input.txt";
List < string > lines = new List < string > ();
using(StreamReader r = new StreamReader(f)) {
string line;
while ((line = r.ReadLine()) != null) {
if (line.StartsWith(" <job_number") && line.EndsWith(">")) {
lines.Add(line);
}
}
}
foreach(string s in lines) {
Console.WriteLine(s);
}
Console.Read();
}
}
在while循环之后,我运行一个条件来查找以某些字符串开头并以某些字符串结尾的任何行。这就是字符串的样子:
<job_number "1234" />
<job_number "1829" />
如何从报价单中提取数字?控制台打印出整条线:
<job_number "1234" />
<job_number "1829" />
我想:
1234
1829
我看过正则表达式,但它让我很困惑。
编辑:我需要补充一点,我正在解析的文件是一个包含大量其他数据的系统配置文件。我设法创建了一个名为lines的列表,它可以获得我需要的确切值。我现在需要在此列表中抛出一些格式以从列表中获取值(引号内的所有内容)。
答案 0 :(得分:3)
在您的情况下,与\d+
匹配的简单正则表达式将完成此任务。
//...
while ((line = r.ReadLine()) != null)
{
var re = Regex.Match(line, @"(\d+)");
if (re.Success)
{
var val = re.Groups[1].Value;
lines.Add(val);
}
}
//...
<强> 编辑: 强>
您当然可以根据您的具体需要更改正则表达式,例如:
var re = Regex.match(line, "job_number\\s\"(\\d+)\"");
如果您的文件也包含其他数字,则可能更合适。
答案 1 :(得分:3)
如果你热衷于LINQ:
var str = @"<job_number ""1234"" />";
var num = new string(str.Where(c => Char.IsDigit(c)).ToArray());
Console.WriteLine(num); // 1234
答案 2 :(得分:0)
使用IndexOf
和Substring
将以速度,内存和简单(部分)的方式完成工作。
if (line.StartsWith(" <job_number") && line.EndsWith(">")) {
int start = line.IndexOf("\"") + 1;
int end = line.IndexOf("\"", start);
if (start > 0 && end > 0)
{
string numberAsString = line.Substring(start, end - start);
int number;
if (int.TryParse(numberAsString, out number))
{
lines.Add(number);
//Console.WriteLine(number);
}
}
}
答案 3 :(得分:0)
如果您的字符串格式不变,您可以使用简单的Split
方法在一行中执行此操作:
string value = input.Split('"')[1];
例如:
string[] s =
{
@"<job_number ""1234"" />",
@"<job_number ""1829"" />"
};
for (int i = 0; i < s.Length; i++) Console.Write(s[i].Split('"')[1] +", ");
输出:1234, 1829
答案 4 :(得分:0)
您正在解析的文件实际上是XML为什么不直接将格式标准化为xml投诉?
<Jobs>
<Job Number="1234" />
<Job Number="1235" />
</Jobs>
然后你可以简单地使用Linq to XML来获取所有Job元素并枚举它们的Number属性。
XDocument doc = XDocument.Load("XMLFile1.xml");
var numbers = from t in doc.Descendants("Job")
select t.Attribute("Number").Value;
foreach (var number in numbers)
{
Console.WriteLine(number);
}