VB.Net正则表达式许可证密钥

时间:2017-05-14 17:00:32

标签: regex vb.net

所以我想解析一些文字( mytext )的许可证密钥。

所有许可证密钥的格式为:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX(X为随机字符)

我试过了:

Dim findtext1 As String = "(?<=\w{5}-\w{5}-\w{5}-\w{5}-\w{5})"
Dim myregex1 As String = mytext
Dim doregex1 As MatchCollection = Regex.Matches(myregex1, findtext1)
Dim matches1 As String = ""
For Each match1 As Match In doregex1
    matches1 = matches1 + match1.ToString + Environment.NewLine
Next
MsgBox(matches1)

但未找到任何结果。

2 个答案:

答案 0 :(得分:0)

  

但未找到任何结果。

您的正则表达式(?<=\w{5}-\w{5}-\w{5}-\w{5}-\w{5})的问题是您尝试使用名为zero-witdh的{​​{1}}来匹配(?<=..)

您应该尝试使用Positive Lookbehind

为了缩短它,有各种各样的方法。就像其中一些人在评论中指出的那样。

答案 1 :(得分:0)

我相信你需要从更大的文本中提取这些数字。因此,您需要使模式成为消耗模式(即删除(?<=和最终),这使得您的模式成为正面观察的示例,仅检查是否text匹配模式,但不会将匹配的文本放入返回的匹配值中,并使用单词边界以避免在较长的子字符串中部分匹配(例如,避免将abc与{{1}匹配a\wc字符串中的模式。)

以下是整个固定代码:

nabc45

请参阅VB.NET demo online。它打印

Dim findtext1 As String = "\b\w{5}(?:-\w{5}){4}\b"
Dim myregex1 As String = "ABCDE-XXXXX-XXXXX-XXXXX-12345;FGHIJ-XXXXX-XXXXX-XXXXX-12345; ABCDE-XXXXX-XXXXX-XXXXX-123456"
Dim doregex1 As MatchCollection = System.Text.RegularExpressions.Regex.Matches(myregex1, findtext1)
Dim matches1 As String = ""
For Each match1 As Match In doregex1
    matches1 = matches1 + match1.ToString + Environment.NewLine
Next
Console.Write(matches1)

但不是ABCDE-XXXXX-XXXXX-XXXXX-12345 FGHIJ-XXXXX-XXXXX-XXXXX-12345 (因为最后一个块包含6位数字)。

模式详情

  • ABCDE-XXXXX-XXXXX-XXXXX-123456 - 字边界
  • \b - 5个字的字符
  • \w{5} - 恰好4次出现(?:-\w{5}){4}后跟5个字词
  • - - 字边界

请参阅regex demo

请注意,在.NET \b匹配\w,即所有Unicode字母和数字,因此,如果您只需要匹配ASCII字符,请传递[\p{L}\p{N}_]选项:

RegexOptions.ECMAScript

另一个注意事项:如果您不需要匹配Regex.Matches(myregex1, findtext1, RegexOptions.ECMAScript) ,则需要调整模式以排除_并将其添加到字边界:

_

请参阅regex demo