与证书匹配的正则表达式语法

时间:2017-07-17 14:53:15

标签: regex

我在使用正则表达式从证书中提取正确用户名的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并丢弃左边的任何内容?

1 个答案:

答案 0 :(得分:0)

您可以使用

Subject:.*CN=(?:\w+\.)+(?<userPrincipalName>\d+)

请参阅regex demo

主要观点是(?:\w+\.)+部分匹配一个或多个单词字符的一个或多个序列,后跟一个.符号。

模式详情

  • Subject: - 文字子字符串
  • .* - 除了换行符之外的任何0 +字符,直到最后一次出现的后续子模式为止
  • CN= - 文字子字符串
  • (?:\w+\.)+ - 一个或多个单词字符的一个或多个序列,后跟.符号
  • (?<userPrincipalName>\d+) - 匹配并捕获一个或多个数字的“userPrincipalName”组。