我正在尝试解析文本行以便检索4个版本号:
v.1.7.600.0 - latest | 9.2.6200.0 to 9.2.9999
我希望能够将这样的一行解析为:
['v.1.7.600.0', 'latest', '9.2.6200.0', '9.2.9999']
目前,我有这样的事情:
var line = "v.1.7.600.0 - latest | 9.2.6200.0 to 9.2.9999"
var result = line.split(/ (\||-|to) /g)
console.log(result)
我在正则表达式上的表现并不是很好但它匹配所以我不确定它为什么会在结果中包含它们。
答案 0 :(得分:6)
你几乎就在那里,只使用非捕获组:
using System;
using System.Linq;
public class SortProblem
{
public static void Main()
{
var result = new[]
{
10, 10, 5, 2, 2, 5, 6, 7, 8, 15, 4, 4, 4, 2, 3, 5, 5, 36, 32, 623, 7, 475, 7, 2, 2, 44, 5, 6, 7, 71, 2
}.Select((element, idx) => new { Value = element, OriginalIndex = idx }).OrderByDescending(item => item.Value).ToList(); // The last one only needed to persist the result set and avoid double processing
Console.WriteLine(string.Join(" ", result.Select(item => item.OriginalIndex)));
Console.WriteLine(string.Join(" ", result.Select(item => item.Value)));
}
}

您需要非捕获组,因为using System;
using System.Text;
public class SortProblem
{
public static void Main()
{
Sort();
}
private static void Sort()
{
StringBuilder sb = new StringBuilder();
var array = new[]
{
10, 10, 5, 2, 2, 5, 6, 7, 8, 15, 4, 4, 4, 2, 3, 5, 5, 36, 32, 623, 7, 475, 7, 2, 2, 44, 5, 6, 7, 71, 2
};
for (int i = 0; i < array.Length; ++i)
{
int max = i;
for (int j = i + 1; j < array.Length; ++j)
if (array[max] < array[j])
max = j;
sb.Append(max);
sb.Append(" ");
int temp = array[i];
array[i] = array[max];
array[max] = temp;
}
Console.WriteLine(sb.Remove(sb.Length - 1, 1).ToString());
Console.WriteLine(string.Join(" ", array));
}
}
会将捕获的值提取到生成的数组中。
此外,将一个或多个空格与var line = "v.1.7.600.0 - latest | 9.2.6200.0 to 9.2.9999";
var result = line.split(/\s+(?:\||-|to)\s+/);
console.log(result);
匹配可能更方便,而不是使用文字空间。
此外,split()
修饰符与\s+
是多余的,它是默认行为。
您还可以为单个字符分隔符定义一个字符类,并写一些更紧凑的/g
正则表达式。