正则表达式返回非捕获组?

时间:2016-12-21 18:10:17

标签: .net regex regex-group

好吧,所以我是regex的新手,或者至少是真正写它们的,但这就是我所拥有的:

字符串:

LDAP://CN=Doe\, John,OU=Users,DC=my,DC=domain

正则表达式(未按预期工作):

(?:LDAP://CN=)([a-zA-Z]+\\?[,\s]?\s?[a-zA-Z]+)

匹配的群组:

LDAP://CN=Doe\, Joe
Doe\, John

捕获组:

LDAP://CN=Doe\, John

我想要回归:

Doe, John

根据我的理解(显然这是不正确的)我的印象是,如果我将?:包含在一个被捕获的组中,它将不会在匹配中返回它;同样,我不想在名称中间的\之前返回, - 我实际上不知道如何在返回的结果中排除字符。有人能够对这件事情发表一些看法吗?

[更新]

我能够得到以下结果(我使用powershell btw):

$qryResult = "LDAP://CN=Doe\, John,OU=Users,DC=my,DC=domain"  
[regex]$re = "LDAP://CN=(.*?),OU"  
$result = $re.Match($qryResult)  
(($result.Value -replace "LDAP://CN=","") -replace "\\","") -replace ",OU",""  

但是从头到尾用正则表达式替换文本就好了。它有可能吗?

2 个答案:

答案 0 :(得分:1)

将PowerShell更改为:

$qryResult = "LDAP://CN=Doe\, John,OU=Users,DC=my,DC=domain"  
[regex]$re = "LDAP://CN=(.*?),OU"  
$result = $re.Match($qryResult).Groups[1]
($result.Value -replace "LDAP://CN=","") -replace "\\",""

它将仅定位第二组(您的捕获组):.Groups[1]

答案 1 :(得分:1)

您可以使用单个-replace获得所需的结果:

PS> $rx = "LDAP://CN=(\p{L}+)(?:\\?,)?(\s*\p{L}+)?,OU=.*"
PS> $res = $qryResult -replace $rx, '$1$2'
PS> $res
Doe John

<强>详情:

  • LDAP://CN= - 文字字符序列
  • (\p{L}+) - 第1组捕获1个以上的字母
  • (?:\\?,)? - 可选\和逗号
  • 的可选序列
  • (\s*\p{L}+)? - 可选的第2组,捕获0个以上的空格和1个以上的字母
  • ,OU=.* - ,OU=字面字符序列,然后是换行符号以外的任何0 +字符。