我整天都在为这个问题绞尽脑汁,我已经接近了,但还没有完全达到目标。我有一个更大的脚本的一个小子集,只是正则表达式部分。下面是到目前为止的脚本:
$CCI_ID = @(
"003417 AR-2.1"
"003425 AR-2.9"
"003392 AP-1.12"
"009012 APP-1(21).1"
)
[regex]::matches($CCI_ID, '(\d{1,})|([a-zA-Z]{2}[-][\d][\(?\){0,1}[.][\d]{1,})') |
ForEach-Object {
if($_.Groups[1].Value.length -gt 0){
write-host $('CCI-' + $_.Groups[1].Value.trim())}
else{$_.Groups[2].Value.trim()}
}
CCI-003417
AR-2.1
CCI-003425
AR-2.9
CCI-003392
AP-1.12
CCI-009012
PP-1(21
CCI-1
The output is correct for all but the last one. It should be:
CCI-009012
APP-1(21).1
Thanks for any advice.
3条答案
按热度按时间f0brbegy1#
不要分别描述和量化(可选的)左括号和右括号,而是将它们组合在一起,然后使 * 整个组 * 可选:
因此,整个模式最终看起来如下所示:
yfwxisqw2#
在您的模式中,您使用了交替的
|
,但是查看示例数据,您可以在它后面匹配一个或多个空格。如果存在模式匹配项,则组1的值已经包含一位或多位数字,因此不必检查
Value.length
括号中包含可选数字的模式:
参见regex101 demo。
产出
jgwigjjp3#
正如您在这里所经历的,Regex表达式可能变得非常复杂和不可读。
因此,从两个不同的Angular 来看待你的问题通常是一个好主意:
在您的情况下,匹配您不想要的部分可能更容易:分隔符,* 空格 *,并在此基础上拆分字符串,这显然是想要实现的:
$_ -Split '\s+', 2
,基于一个或多个空格拆分相关字符串(其中您也可以考虑文字空格:-Split ' '
)。, 2
将防止字符串拆分为两个以上的部分。这意味着第二部分将不会被进一步拆分,即使它包含空格。