c# - C# 中的正则表达式字符串缩减器?

标签 c# regex string .net-4.5

假设我有这个未知字符串:

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/

相关文章:

python - 清理推文的问题(表情符号、笑脸......)

r - 查找一个字符串是否出现在另一个字符串之前

c# - 在 C# 中从 dll 调用同时具有 wchar 和 char 的 C 函数

regex - PostgreSQL 正则表达式 - 查找具有单个字符的记录

c# - 具有大或*非常*大文件的 Resharper

java - 正则表达式中使用 OR 进行分割

c# - 如何在字符串末尾插入退格

c# - 检查子字符串的有效方法 C#

c# - 在 C# 中清除 ColorConvertedBitmap

c# - ASP :radiobuttonlist css style