使用模式的.net正则表达式编号生成器
我有一根这样的绳子使用模式的.net正则表达式编号生成器,.net,string,.net,String,我有一根这样的绳子 "{{A to B}}{{1 to 3}}" 它应产生: A1 A2 A3 B1 B2 B3 请注意,模式字符串中可能有任意数量的模式 解决这个问题的最好办法是什么?在.Net中首选解决方案。如评论中所述,仅使用正则表达式无法解决此问题。以下是一些您可能会觉得有用的代码: var input = "{{A to B}}{{1 to 3}}{{a to f}}"; var regex = new Regex("\\{\\{((?<p1>[a-z]) to
"{{A to B}}{{1 to 3}}"
它应产生:
A1
A2
A3
B1
B2
B3
请注意,模式字符串中可能有任意数量的模式
解决这个问题的最好办法是什么?在.Net中首选解决方案。如评论中所述,仅使用正则表达式无法解决此问题。以下是一些您可能会觉得有用的代码:
var input = "{{A to B}}{{1 to 3}}{{a to f}}";
var regex = new Regex("\\{\\{((?<p1>[a-z]) to (?<p2>[a-z]))|((?<p1>[A-Z]) to (?<p2>[A-Z]))|((?<p1>\\d) to (?<p2>\\d))\\}\\}");
var groups = new List<List<string>>();
foreach (Match match in regex.Matches(input))
{
var start = match.Groups["p1"].Value;
var end = match.Groups["p2"].Value;
var group = new List<string>();
int startValue;
int endValue;
if (int.TryParse(start, out startValue) && int.TryParse(end, out endValue))
{
for (int i = startValue; i <= endValue; i++)
{
group.Add(i.ToString());
}
}
else
{
var startChar = char.Parse(start);
var endChar = char.Parse(end);
for (char c = startChar; c <= endChar; c++)
{
group.Add(c.ToString());
}
}
groups.Add(group);
}
var cartesianProduct = groups.CartesianProduct();
var result = cartesianProduct.Select(x => string.Concat(x.ToArray()));
foreach (var r in result)
{
Console.WriteLine(r);
}
var input=“{{A到B}}{{1到3}}{{A到f}}”;
var regex=new regex(“\\{((?[a-z])到(?[a-z]))|((?[a-z])到(?[a-z]))|((?\\d)到(?\\d))\}”;
变量组=新列表();
foreach(regex.Matches中的匹配(输入))
{
var start=match.Groups[“p1”]值;
var end=match.Groups[“p2”].Value;
var group=新列表();
国际标准价值;
内端值;
if(int.TryParse(开始,输出起始值)和&int.TryParse(结束,输出结束值))
{
for(int i=startValue;ifor循环如何?使用正则表达式:
string input = "{{A to B}}{{1 to 3}}";
Match match = Regex.Match(input, @"\{\{([A-Za-z])\sto\s([A-Za-z])\}\}\{\{([\d])\sto\s([\d])\}\}");
List<char> rangeChar = new List<char>(){match.Groups[1].Value[0],match.Groups[2].Value[0]};
List<int> rangeInt = new List<int>() { int.Parse(match.Groups[3].Value), int.Parse(match.Groups[4].Value) };
for (int i =rangeChar.First() ; i<=rangeChar.Last();i++)
for (int j = rangeInt.First(); j <= rangeInt.Last(); j++)
{
Console.WriteLine((char)i+j.ToString());
}
string input=“{{A到B}{{{1到3}}”;
Match Match=Regex.Match(输入,@“{{([A-Za-z])\sto\s([A-Za-z])\}{([\d])\sto\s([\d])\}”);
List rangeChar=new List(){match.Groups[1]。值[0],match.Groups[2]。值[0]};
List rangeInt=new List(){int.Parse(match.Groups[3].Value),int.Parse(match.Groups[4].Value)};
for(int i=rangeChar.First();i rangeInt.Add(int.Parse(x));
对于(int i=rangeChar.First();iThe“regex”标记让我感到困惑-您只是想列出所有可能的组合,或者将其转换为一个regex以匹配其中任何组合,还是…?这无法由regex解决。这需要编程。您删除regex标记
string input = "{{A to B}}{{1 to 3}}";
Match match = Regex.Match(input, @"\{\{([A-Za-z])\sto\s([A-Za-z])\}\}\{\{([\d])\sto\s([\d])\}\}");
List<char> rangeChar = new List<char>(){match.Groups[1].Value[0],match.Groups[2].Value[0]};
List<int> rangeInt = new List<int>() { int.Parse(match.Groups[3].Value), int.Parse(match.Groups[4].Value) };
for (int i =rangeChar.First() ; i<=rangeChar.Last();i++)
for (int j = rangeInt.First(); j <= rangeInt.Last(); j++)
{
Console.WriteLine((char)i+j.ToString());
}
string input = "{{A to B}}{{1 to 3}}";
string[] inputSplit = input.Split(new[] {@"}{"},StringSplitOptions.None);
List<char> rangeChar = new List<char>();
inputSplit[0].Trim(' ', '{', '}').Split(new[] { "to" }, StringSplitOptions.RemoveEmptyEntries).ToList().ForEach(x => rangeChar.Add(x.Trim()[0]));
List<int> rangeInt = new List<int>();
inputSplit[1].Trim(' ', '{', '}').Split(new[] { "to" }, StringSplitOptions.RemoveEmptyEntries).ToList().ForEach(x=> rangeInt.Add(int.Parse(x)));
for (int i =rangeChar.First() ; i<=rangeChar.Last();i++)
for (int j = rangeInt.First(); j <= rangeInt.Last(); j++)
{
Console.WriteLine((char)i+j.ToString());
}