我在使用正则表达式从证书中提取正确用户名的cisco设备上进行身份验证。
我有一些细节,我无法在格式组合中找到答案。
我有正确的正则表达式组合从我的证书中提取正确的格式:/Subject:.*CN=\w+\.\w+\.(?<userPrincipalName>(\d+))/m
问题出现了,当我的同事试图用它来拉他的用户名时,它给了我一个不匹配的
我遇到的问题是证书上的用户名是FIRSTNAME.MIDDLENAME.LASTNAME.123456789@email
格式
我需要从该证书中提取的唯一内容是123456789@email
因此,例如我的证书将CommonName拉为:Mike.Smith.123456789@email
我申请的正则表达式:/Subject:.*CN=\w+\.\w+\.(?<userPrincipalName>(\d+))/m
给了我123456789@email
这正是我需要的
John.Frank.Jones.123456789@email
它不会正确拉动并给我 No Match
如果我将正则表达式更改为/Subject:.*CN=\w+\.\w+\.\w+\.(?<userPrincipalName>(\d+))/m
它将提取正确的名称,因为它删除了所有三个名称,只留下123456789@email
问题是现在我的证书没有正确提取,因为它丢弃了所有内容,包括号码
是否有一个正则表达式组合只会拉出123456789@email
并丢弃左边的任何内容?
答案 0 :(得分:0)
您可以使用
Subject:.*CN=(?:\w+\.)+(?<userPrincipalName>\d+)
请参阅regex demo
主要观点是(?:\w+\.)+
部分匹配一个或多个单词字符的一个或多个序列,后跟一个.
符号。
模式详情:
Subject:
- 文字子字符串.*
- 除了换行符之外的任何0 +字符,直到最后一次出现的后续子模式为止CN=
- 文字子字符串(?:\w+\.)+
- 一个或多个单词字符的一个或多个序列,后跟.
符号(?<userPrincipalName>\d+)
- 匹配并捕获一个或多个数字的“userPrincipalName”组。