【发布时间】:2015-02-20 05:57:54
【问题描述】:
我已经使用了一段时间了,这个简洁的功能在 SO 上找到了 here:
private List<string> ReverseStringFormat(string template, string str)
{
string pattern = "^" + Regex.Replace(template, @"\{[0-9]+\}", "(.*?)") + "$";
Regex r = new Regex(pattern);
Match m = r.Match(str);
List<string> ret = new List<string>();
for (int i = 1; i < m.Groups.Count; i++)
ret.Add(m.Groups[i].Value);
return ret;
}
此函数能够正确处理模板,例如:
My name is {0} and I'm {1} years old
虽然它因以下模式而失败:
My name is {0} and I'm {1:00} years old
我想处理这种失败的情况并添加固定长度解析。 该函数将(第一个)模板转换如下:
My name is (.*?) and I'm (.*?) years old
我一直在尝试编写上述正则表达式来限制为第二组捕获的字符数,但没有成功。这是我的(可怕的)尝试:
My name is (.*?) and I'm (.{2}) years old
我一直在尝试处理如下输入,但以下 PATTERN 不起作用:
PATTERN: My name is (.*?) (.{3})(.{5})
INPUT: My name is John 123ABCDE
EXPECTED OUTPUT: John, 123, ABCDE
每一个建议都非常感谢
【问题讨论】:
-
您的输入和预期输出是什么?
-
重新排序实际参数而不是字符串格式本身不是更容易吗?
-
我一直在使用这个函数进行可配置的解析。如果可能的话,我想扩展它......也许我不明白你对重新排序实际参数的意思
-
@juharr 是对的。关于模板,我们唯一知道的是什么已经可以工作,
{1:00}不工作,但实际上,{1:00}没有任何意义。 -
@dna2 这很奇怪,因为 (.{3}) 应该可以工作...尝试在regex101.com上进行测试