我有一个包含以下文本的字符串:
[l=9;f=0;r=5;p=2]
可能有多个:
[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]
我想获取字符串数组(例如第二个):
[l=9;f=0;r=5;p=2]
[l=9;f=0;r=6;p=2]
我试过这个,但它分裂不正确:
Regex.Split(seat, "(?=])");
PS。正则表达式不是强制性的。
string input = "[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]";
var list = Regex.Matches(input, @"\[.+?\]")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
以下模式可能会帮助您使用 Regex 的拆分选项
string input = "[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]";
string pattern = @"(?<=\]);";
Regex regex = new Regex(pattern);
string[] data = regex.Split(input);
"[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]".Split(new string[] { "];" }, StringSplitOptions.None)
然后将“]”附加到数组中的每个项目......
丑陋但应该工作。
为什么不使用正则表达式捕获?
该模式\[l=(\d);f=(\d);r=(\d);p=(\d)\]
将捕获每个数组中的值。
例子:
private static IEnumerable<dynamic> Match(string text)
{
return Regex.Matches(text, @"\[l=(\d);f=(\d);r=(\d);p=(\d)\]")
.Cast<Match>()
.Where(m => m.Success)
.Select(m => new { l = m.Groups[1].Value, f = m.Groups[2].Value, r = m.Groups[3].Value, p = m.Groups[4].Value });
}
static void Main(string[] args)
{
foreach (var result in Match("[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]"))
Console.Out.WriteLine("Setting: {0}, {1}, {2}, {3}", result.l, result.f, result.r, result.p);
foreach (var result in Match("[l=9;f=0;r=5;p=2]"))
Console.Out.WriteLine("Setting: {0}, {1}, {2}, {3}", result.l, result.f, result.r, result.p);
}
这是一种 LINQ 方法:
Func<string, string> process = s =>
String.Format("[{0}]",
String.Join("];[",
s
.Split('[')
.Select(x => x.Split(']'))
.SelectMany(x => x)
.Where(x => x != "" && x !=";")));
至少它有效。:-)
像这样使用它:
var result = process("[l=9;f=0;r=5;p=2];[l=9;f=0;r=6;p=2]");
在您的代码中:
Regex.Split(seat, "(?=])");
似乎您只是缺少正则表达式中的实际分号和括号的反斜杠。这有效:
string[] data = Regex.Split(seat, ";(?=\\[)");