所以我想解析一些文字( 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)
但未找到任何结果。
答案 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。