变量中变量的名称是什么

时间:2014-03-20 14:02:02

标签: regex variables powershell

我正在为vars分配一系列正则表达式。一些正则表达式值将是相同但唯一的,并且可由var名称本身识别(例如$ a和$ c)。

#various regex 
$a = "([\d]{1,2})"
$b = "([\d]{3})"
$c = $b #Note this has the same regex as $b 
$d = "\s[-]\s"
$e = "[_]"

#select the pattern
$patternNum = 4

然后我希望能够以不同的顺序连接变量以创建更大的正则表达式。

Switch ($patternNum){

#create a pattern
1 { $pattern = ($a, $e, $b) }
2 { $pattern = ($a, $d, $b) }
3 { $pattern = ($a, $d, $a, $e, $b) }
4 { $pattern = ($a, $e, $b, $e, $c) }

}

这会创建扩展的正则表达式字符串,我希望

#so i can use full regex pattern later
$selectedPattern = -join $pattern

但是我希望能够将$ pattern中的var与原始var名称相关联,而不是与var关联的文字字符串(因为某些字符串将是相同的)

#find the index of each var and assign to another var so var can be used later to identify position within match 
var1 = [array]::IndexOf($pattern, $a) # [0]
var2 = array]::IndexOf($pattern, $b) # [2]
var3 = [array]::IndexOf($pattern, $c) # [2] but i want it to be [4] 

将用于匹配的正则表达式,每个匹配将用于不同的字符串和不同的位置

我以为我可以使用scriptblock {}然后转换回字符串,但这似乎不起作用。任何人都可以想出一种方法来获得每个vars的原始var名称或想出更好的方法吗?

2 个答案:

答案 0 :(得分:0)

按照你的代码我会这样做,但知道你真正需要什么,有人可以建议其他解决方案:

$c = $b 
$d = "\s[-]\s"
$e = "[_]"

#select the pattern
$patternNum = 4

Switch ($patternNum){

#create a pattern
1 { $pattern = ('$a', '$e', '$b') }
2 { $pattern = ('$a', '$d', '$b') }
3 { $pattern = ('$a', '$d', '$a', '$e', '$b') }
4 { $pattern = ('$a', '$e', '$b', '$e', '$c') }

}

$selectedPattern = -join $pattern

$var1 = [array]::IndexOf($pattern, '$a') # [0]
$var2 = [array]::IndexOf($pattern, '$b') # [2]
$var3 = [array]::IndexOf($pattern, '$c') # [4] 

#converting literal to your pattern
$regexpattern = $ExecutionContext.InvokeCommand.ExpandString( -JOIN $pattern )

$regexpattern
([\d]{1,2})[_]([\d]{3})[_]([\d]{3})

答案 1 :(得分:0)

使用命名捕获

使用(?)语法创建命名捕获。使名称与变量名称相同,例如:

$A = '(?<A>\d{3})'
$B = '(?<B>\D{3})'

$string = 'ABC123'

$regex = $B + $A

$string -match $regex

$Matches

Name                           Value                                                             
----                           -----                                                             
A                              123                                                               
B                              ABC                                                               
0                              ABC123  

现在您可以将变量关联到字符串中匹配的位置,如下所示:

$string.IndexOf($Matches.A)
3

$string.IndexOf($Matches.B)
0