我试图使用.NET正则表达式解析如下所示的字符串:

H3Y5NC8E-TGA5B6SB-2NVAQ4E0

并使用Split返回以下内容:H3Y5NC8E TGA5B6SB 2NVAQ4E0

我根据特定字符集验证每个字符(请注意,字母'I','O','U'和'W'不存在),因此使用string.Split不是一个选项。 每组中的字符数可以变化,组的数量也可以变化。 我使用以下表达式:

([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}-?){3}

这将恰好匹配3组,每组8个字符。 任何或多或少都会使比赛失败。 只要它正确匹配输入,这是有效的。 但是,当我使用Split方法提取每个字符组时,我只得到最后一组。 RegexBuddy抱怨我已经重复了捕获组本身,我应该在重复组周围放置一个捕获组。 但是,我没有尝试这样做能达到预期的效果。 我一直在尝试这样的表达式:

(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){4}

但这不起作用。

由于我在代码中生成正则表达式,我可以通过组的数量扩展它,但我希望有一个更优雅的解决方案。


请注意,字符集不包括整个字母表。 它是产品激活系统的一部分。 因此,可以删除任何可能被意外解释为数字或其他字符的字符。 例如字母'I','O','U'和'W'不在字符集中。

连字符是可选的,因为用户不需要顶部输入,但如果用户完成了复制和粘贴,它们就可以在那里。

===============>>#1 票数:5

顺便说一下,您可以用更易读的减去字符类替换[ABCDEFGHJKLMNPQRSTVXYZ0123456789]字符类。

[[A-Z\d]-[IOUW]]

如果您只想匹配3个这样的组,为什么不在正则表达式中使用此模式3次并仅使用捕获的1,2,3个子组来形成新字符串?

([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}

在PHP我会回来(我不知道.NET)

return "$1 $2 $3";

===============>>#2 票数:3

在审核了您的问题和给出的答案后,我想出了这个:

RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})", options);
string input = @"H3Y5NC8E-TGA5B6SB-2NVAQ4E0";

MatchCollection matches = regex.Matches(input);
for (int i = 0; i != matches.Count; ++i)
{
    string match = matches[i].Value;
}

由于“ - ”是可选的,因此您无需包含它。 我不确定你最后使用{4}是什么? 这将根据您的需要找到匹配项,然后使用MatchCollection您可以访问每个匹配项以重建字符串。

===============>>#3 票数:3 已采纳

我发现了我追求的答案。 这是我的工作代码:

    static void Main(string[] args)
    {
        string pattern = @"^\s*((?<group>[ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){3}\s*$";
        string input = "H3Y5NC8E-TGA5B6SB-2NVAQ4E0";
        Regex re = new Regex(pattern);
        Match m = re.Match(input);

        if (m.Success)
            foreach (Capture c in m.Groups["group"].Captures)
                Console.WriteLine(c.Value);
    }

===============>>#4 票数:0

为什么要使用正则表达式? 如果组总是被 - 分割,你不能使用Split()吗?

===============>>#5 票数:0

对不起,如果这不是你想要的,但你的字符串总是有连字符分隔组然后而不是使用正则表达式你不能使用String.Split()方法?

Dim stringArray As Array = someString.Split("-")

===============>>#6 票数:0

您可以使用此模式:

Regex.Split("H3Y5NC8E-TGA5B6SB-2NVAQ4E0", "([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}+)-?")

但是您需要从结果数组中过滤掉空字符串。 来自MSDN的引文:

如果多个匹配彼此相邻,则将空字符串插入到数组中。

===============>>#7 票数:0

有效块的定义特征是什么? 我们需要知道,以便真正有所帮助。

我的通用建议,在第一步验证字符集,然后根据您的期望以单独的方法拆分和解析。 如果这是在网站/应用程序中,那么您可以在前端使用ASP Regex验证,然后在后端将其分解。

===============>>#8 票数:0

如果您只是使用group(i).value检查组的值,那么您将只获得最后一个。 但是,如果要在捕获组的所有时间进行枚举,请使用group(2).captures(i).value,如下所示。

system.text.RegularExpressions.Regex.Match("H3Y5NC8E-TGA5B6SB-2NVAQ4E0","(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]+)-?)*").Groups(2).Captures(i).Value

===============>>#9 票数:0

麦克风,

您可以在字符组中使用您选择的字符集。 您只需添加“+”修饰符即可捕获所有组。 看我之前的回答,只需将[A-Z0-9]更改为您需要的任何内容(即[ABCDEFGHJKLMNPQRSTVXYZ0123456789])

  ask by Mike Thompson translate from so

未解决问题?本站智能推荐:

3回复

在字符串的所有实例前添加一个char

我正在使用C#。 NET 2.0和WinForms。 我有一段在Assembly中格式化的代码,如下所示: 输出应为: 当然,还有更多。 就像2000行一样,关键是文件的顶部有声明,我可以加载/保存它们或对其进行任何操作。 但是我的问题是,我必须在所有这些声明(甚至在
6回复

正则表达式在字符串中查找第一个大写字母

我想在字符串中找到第一个大写字母出现的索引。 例如 - 索引应该为此字符串返回2。 正则表达式应该在找到第一个大写字母后忽略所有其他大写字母。 如果没有找到大写字母,那么它应该返回0.请帮助。
2回复

捕获堆栈溢出异常C#[重复]

这个问题已经在这里有了答案 : 如何防止和/或处理StackOverflowException? (10个回答) C#捕获堆栈溢出异常 (9个答案) 可能重复:
1回复

如何查询一个域的用户是否是另一个AD域中的组的成员?

我有一系列应用程序都使用我创建的相同C#,。Net 2.0代码来检查并查看用户是否是Active Directory组的成员。 直到最近,当我将另一个可信赖的AD域中的用户添加到我的AD组之一时,我的代码没有遇到任何问题。 我的问题是如何检查用户是否是Active Directory组的
6回复

.NET 2.0中是否有一个集合类型? [重复]

可能重复: .Net中是否有“Set”数据结构? 重复:这是“.Net中有”设置“数据结构吗? ”的副本。 请将其作为副本关闭,并解决之前问题的任何进一步答案。 是否有类似于.NET框架中的STL set<T>模板的泛型集合? 如果没有,您将如何实现非有
5回复

如何从一个列表中删除重复项 在另一个中找到的?

这是用于.NET 2.0,所以我不能使用LINQ。 我有一个有趣的问题。 我正在合并两个自定义类型“ Article”的列表。 下面的代码很好地完成了这项工作: GetFeatureArticle只有两个项目,它们是合并列表中的前两个元素。 “结果”很大,其元素落后于
4回复

为什么无法捕获MissingMethodException?

我在ClickOnce部署的应用程序中依赖于.NET 2.0 SP2( ApplicationDeployment.CurrentDeployment.CheckForDetailedUpdate(false)方法仅适用于SP2)。 我想检查应用启动期间SP2是否存在。 我试图通过在调用
4回复

关于获得的问题 组;

每当我更改类属性之一时,我想设置一个修改的标志,如下所示 问题是我有一个错误,编译器要求我为get声明一个主体; 我宁愿不必声明一个单独的私有变量,还有另一种方法可以做到这一点。 c#,,net-2 谢谢
1回复

如何检索组中的用户,包括主要组用户

我正在.net 2.0中工作,需要检索给定AD组的所有用户。 我有以下方法可以返回该组的所有成员,但不会返回将已通过组作为其主要组的用户。 我需要怎么做才能使这些用户也包括在内?
2回复

查询本地管理员组

所以,我有点卡在这里... 我正在编写一个程序,该程序应该能够列出MS Windows Server 2008 R2上本地管理员组中的所有用户。 这里的问题是只允许我使用.NET 2.0-因此我无法使用GroupPrincipal类...这将使这项工作变得非常简单。 任何指针都