获取较长字符串的子字符串的最佳方法
Best way to get substrings of a longer string
在 C# 中提取较长字符串的子字符串的最佳方法是什么,例如:
String str = "Car: volvo Wheels: 4 doors: 5";
假设我想将值 volvo、4、5 插入
string car
string wheels
string doors
string newStr = str.Substring(read.IndexOf(':'), read.IndexOf(" "));
然后在提取第一个字符串后,我将删除该部分
string str = strRemove(0, read.IndexOf(" ") + 1);
然后重复这个直到所有的东西都被提取出来。实在是太乏味了,我想会有更好的方法。
怎么样...
string rawData = "Car: volvo Wheels: 4 doors: 5";
var words = Regex.Split(rawData, @"\w+:").Select(x => x.Trim()).Where(x => x.Length > 0).ToList();
var car = words[0];
var wheels = words[1];
var doors = words[2];
试试正则表达式
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input = "Car: volvo Wheels: 4 doors: 5";
string pattern = @"Car:\s+(?'Car'[^\s]+)\s+Wheels:\s+(?'Wheels'[^\s]+)\s+doors:\s+(?'Doors'[^\s]+)";
Match match = Regex.Match(input, pattern);
string car = match.Groups["Car"].Value;
string wheels = match.Groups["Wheels"].Value;
string doors = match.Groups["Doors"].Value;
}
}
}
由于缺乏更详细的信息,因此很难确定此处的正确答案是什么。但是,假设标签 "Car:"、"Wheel:" 和 "doors:" 是不变的,并且您想在每个标签后提取变量值,类似下面的内容应该可以满足您的需求:
static readonly Regex _regex = new Regex(
@"Car: (?<car>[^ ]*) Wheels: (?<wheels>[^ ]*) doors: (?<doors>[^ ]*)",
RegexOptions.Compiled);
void SomeMethod(string text)
{
Match match = _regex.Match(text);
if (!match.Success)
{
return;
}
string car = match.Groups["car"].Value;
string wheels = match.Groups["wheels"].Value;
string doors = match.Groups["doors"].Value;
}
您可以将该技术推广到具有规则结构模式的任何类型的字符串。
最可靠的方法是使用正则表达式。其他人提供了正则表达式作为解决方案,但他们没有涵盖汽车名称中有 space 的情况,如 "Alfa Romeo"。这种解决方案在这些情况下会更好。
string input = "Car: volvo Wheels: 4 doors: 5";
Match match = Regex.Match(input, @"Car: (?<car>.+) Wheels: (?<wheels>\d+) doors: (?<doors>\d+)");
Console.WriteLine(match.Groups["car"].Value);
Console.WriteLine(match.Groups["wheels"].Value);
Console.WriteLine(match.Groups["doors"].Value);
在 C# 中提取较长字符串的子字符串的最佳方法是什么,例如:
String str = "Car: volvo Wheels: 4 doors: 5";
假设我想将值 volvo、4、5 插入
string car
string wheels
string doors
string newStr = str.Substring(read.IndexOf(':'), read.IndexOf(" "));
然后在提取第一个字符串后,我将删除该部分
string str = strRemove(0, read.IndexOf(" ") + 1);
然后重复这个直到所有的东西都被提取出来。实在是太乏味了,我想会有更好的方法。
怎么样...
string rawData = "Car: volvo Wheels: 4 doors: 5";
var words = Regex.Split(rawData, @"\w+:").Select(x => x.Trim()).Where(x => x.Length > 0).ToList();
var car = words[0];
var wheels = words[1];
var doors = words[2];
试试正则表达式
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input = "Car: volvo Wheels: 4 doors: 5";
string pattern = @"Car:\s+(?'Car'[^\s]+)\s+Wheels:\s+(?'Wheels'[^\s]+)\s+doors:\s+(?'Doors'[^\s]+)";
Match match = Regex.Match(input, pattern);
string car = match.Groups["Car"].Value;
string wheels = match.Groups["Wheels"].Value;
string doors = match.Groups["Doors"].Value;
}
}
}
由于缺乏更详细的信息,因此很难确定此处的正确答案是什么。但是,假设标签 "Car:"、"Wheel:" 和 "doors:" 是不变的,并且您想在每个标签后提取变量值,类似下面的内容应该可以满足您的需求:
static readonly Regex _regex = new Regex(
@"Car: (?<car>[^ ]*) Wheels: (?<wheels>[^ ]*) doors: (?<doors>[^ ]*)",
RegexOptions.Compiled);
void SomeMethod(string text)
{
Match match = _regex.Match(text);
if (!match.Success)
{
return;
}
string car = match.Groups["car"].Value;
string wheels = match.Groups["wheels"].Value;
string doors = match.Groups["doors"].Value;
}
您可以将该技术推广到具有规则结构模式的任何类型的字符串。
最可靠的方法是使用正则表达式。其他人提供了正则表达式作为解决方案,但他们没有涵盖汽车名称中有 space 的情况,如 "Alfa Romeo"。这种解决方案在这些情况下会更好。
string input = "Car: volvo Wheels: 4 doors: 5";
Match match = Regex.Match(input, @"Car: (?<car>.+) Wheels: (?<wheels>\d+) doors: (?<doors>\d+)");
Console.WriteLine(match.Groups["car"].Value);
Console.WriteLine(match.Groups["wheels"].Value);
Console.WriteLine(match.Groups["doors"].Value);