所以我想从一些文本(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)
但是没有发现任何结果。
我相信你需要从更大的文本中提取这些数字。因此,您需要使模式成为消费模式(即,删除使模式成为正后视示例的(?<=
和最终)
,该示例仅检查文本是否与模式匹配,但不将匹配的文本放入返回的匹配值中)并使用单词边界以避免较长子字符串中的部分匹配(例如,避免将abc
与nabc45
字符串中的awc
模式匹配)。
这是整个固定代码:
Dim findtext1 As String = "bw{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)
在线观看 VB.NET 演示。它打印
ABCDE-XXXXX-XXXXX-XXXXX-12345
FGHIJ-XXXXX-XXXXX-XXXXX-12345
但不是ABCDE-XXXXX-XXXXX-XXXXX-123456
(因为最后一个块包含 6 位数字)。
图案详情:
b
- 单词边界w{5}
- 5 字字符(?:-w{5}){4}
- 正好出现 4 次-
后跟 5 个单词字符b
- 单词边界
请参阅正则表达式演示。
请注意,在 .NET 中,w
匹配[p{L}p{N}_]
,即所有 Unicode 字母和数字,因此,如果您只需要匹配 ASCII 字符,请传递RegexOptions.ECMAScript
选项:
Regex.Matches(myregex1, findtext1, RegexOptions.ECMAScript)
还有一个注意事项:如果你不需要匹配一个_
,你需要调整模式以排除_
并将其添加到单词边界:
(?<=b|_)[^W_]{5}(?:-[^W_]{5}){4}(?=b|_)
请参阅正则表达式演示。
但是没有找到任何结果。
您的正则表达式(?<=w{5}-w{5}-w{5}-w{5}-w{5})
的问题是您试图通过使用称为Positive Lookbehind
的(?<=..)
来匹配zero-witdh
。
您应该尝试使用^(w{5}-w{5}-w{5}-w{5}-w{5})$
.
为了简短起见,有多种方法。就像他们中的一些人在评论中指出的那样。