我在Powershell中有来自网站的证书信息,它们通常看起来像这样

CN=Google Internet Authority G3, O=Google Trust Services, C=US
  • 我需要帮助来获取正确的正则表达式,以便仅在CN =之后获取信息逗号
  • 第二个问题是我得到的某些证书​​只有CN =,因此末尾没有逗号,因此看起来像
  • CN=Google Internet Authority G3
    

    如何使用正则表达式来捕获这两种情况?

    这是我认为可以工作并尝试的方法:
    $cert.Issuer -match "CN=(?<issuer>.*(?=,))"
        Write-Host $Matches['issuer']
    >> Google Internet Authority G3, O=Google Trust Services
    
    $cert.Issuer -match "CN=(?<issuer>.*)?,?\s"
        Write-Host $Matches['issuer']
    >> Google Internet Authority G3, O=Google Trust Services,
    
    $cert.Issuer -match "CN=(?<issuer>.*),|\s"
        Write-Host $Matches['issuer']
    >> Google Internet Authority G3, O=Google Trust Services
    

    所以我只想
    Google Internet Authority G3
    

    它是否有逗号,然后是更多信息,还是没有逗号,是字符串的结尾

    谢谢!

    最佳答案

    如果文本本身不能包含逗号,则可以使用否定的字符类来匹配除逗号以外的任何字符。然后匹配在命名捕获组issuer

    CN=(?<issuer>[^,]+)
    

    如果不想匹配换行符,可以扩展否定的字符类
    CN=(?<issuer>[^,\r\n]+)
    

    说明
  • CN=从字面上匹配
  • (?<issuer>命名组issuer
  • [^,\r\n]+ Negated character class,匹配除逗号或换行符之外的任何字符的1+倍
  • )关闭已命名的组

  • Regex demo | Try it online

    如果文本可以包含逗号,则可以匹配除换行符非贪心字符之外的任何字符,然后匹配逗号和空格或字符串的结尾。
    CN=(?<issuer>.*?)(?:, |$)
    

    说明
  • CN=从字面上匹配
  • (?<issuer>命名组issuer
  • .*?匹配除换行符非贪心(尽可能少)以外的任何字符
  • )关闭已命名的组
  • (?:非捕获组
  • , 匹配逗号和空格
  • |
  • $声明字符串
  • 的结尾
  • )关闭已命名的组

  • Regex demo | Try it online

    07-28 14:02