假设我有这个未知字符串:
var t = "G9906QZN-SXK9-TUCE-10F5-CB2C1DA9D24A.hello";
我需要以通用方式为该字符串生成一个正则表达式。
请注意,准确 字符串不是正则表达式,否则我会使用准确的字符。
换句话说:所有这 3 个都应该有相同的正则表达式:
G9906QZN-SXK9-TUCE-10F5-CB2C1DA9D24A.hello
G9906QZN-SXK9-TUCE-267F-F361D103A627.hello
G9906QZN-SXK9-TUCE-0360-370482E00155.hello
所有这 3 个也应该有相同的正则表达式:
G9906QZN^SXK9^TUCE^10F5^CB2C1DA9D24A.hello
G9906QZN^SXK9^TUCE^267F^F361D103A627.hello
G9906QZN^SXK9^TUCE^0360^370482E00155.hello
此外 - 可以有多个拆分器 - 它是一种随机模式生成的文件:
所以所有这 3 个也应该有相同的正则表达式:
G9906QZN^SXK9 TUCE[10F5-CB2C1DA9D24A.hello
G9906QZN^SXK9 TUCE[267F-F361D103A627.hello
G9906QZN^SXK9 TUCE[0360-370482E00155.hello
这就是我所做的:(现在忽略区分大小写)
代码:
var t = "G9906QZN-SXK9-TUCE-10F5-CB2C1DA9D24A.hello";
List<string> lst = new List<string>(); //stringBuilder can also be used.
foreach (char element in t)
{
if (char.IsDigit(element) || char.IsLetter(element))
lst.Add(@"\w");
else
lst.Add(@"\"+element); //escape all other
}
Console.WriteLine(string.Join( "",lst.ToArray()) );
结果:
\w\w\w\w\w\w\w\w\-\w\w\w\w\-\w\w\w\w\-\w\w\w\w\-\w\w\w\w\w\w\w\w\w\w\w\w\.\w\w\w\w\w
问题:
我想将该正则表达式“缩小”成类似这样的内容:
\w{8}\-\w{4}\-\w{4}\-\w{12}\.\w{5}
之前我开始做一些非常丑陋的事情,比如:第一次出现、最后一次出现和重置计数器,有没有更优雅的方式来做这件事?
最佳答案
你可以只使用正则表达式来生成它
var t = "G9906QZN-SXK9-TUCE-10F5-CB2C1DA9D24A.hello";
Console.WriteLine(Regex.Replace(Regex.Escape(t), @"\w+", m => @"\w{" + m.Length + "}"));
结果:
\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\.\w{5}
如果你想把 _
当作分隔符,那么你应该使用 [\w-[_]]
而不是简单的 \w
Regex.Replace(Regex.Escape(t),
@"[\w-[_]]+", m => $@"[\w-[_]]{{{m.Length}}}");
关于c# - C# 中的正则表达式字符串缩减器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815022/