Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用Powershell子字符串和正则表达式提取数量可变的令牌_Regex_Powershell_Text Parsing - Fatal编程技术网

Regex 使用Powershell子字符串和正则表达式提取数量可变的令牌

Regex 使用Powershell子字符串和正则表达式提取数量可变的令牌,regex,powershell,text-parsing,Regex,Powershell,Text Parsing,所以我从这个论坛得到了使用下面的Powershell和Regex的帮助 if((get-content -Raw c:\config.txt) -match '(?ms)^999.*?(?=\r?\n\S|\Z)') { $matches[0]} 要成功从下面的配置中提取vlan 999未使用的正确信息,请执行以下操作 1 default active Fa0/4, Fa0/5, Fa0/6, Fa0/7, Fa0/8 120

所以我从这个论坛得到了使用下面的Powershell和Regex的帮助

if((get-content -Raw c:\config.txt) -match '(?ms)^999.*?(?=\r?\n\S|\Z)')
{ $matches[0]} 
要成功从下面的配置中提取vlan 999未使用的正确信息,请执行以下操作

1    default                          active    Fa0/4, Fa0/5, Fa0/6, Fa0/7, Fa0/8
120  Camera                           active    Fa0/2
130  Student                  active    Fa0/1
100  Management                        active    
999  Unused               active    Fa0/10, Fa0/11, Fa0/12, Fa0/13, 
                                                Fa0/14, Fa0/15, Fa0/16, Fa0/17
                                                Fa0/18, Fa0/19
然后我可以使用下面的substring方法提取端口号,如下所示

Fa0/10, Fa0/11, Fa0/12, Fa0/13, Fa0/14, Fa0/15, Fa0/16, Fa0/17 Fa0/18, Fa0/19

$Unused_VLAN = $Matches[0]
$Unused_ports = Unused_VLAN.substring (48, 77) 
我的问题是我必须在多个配置文件上提取这些信息,而每个配置文件都有不同数量的未使用端口


我的问题是,有比使用substring方法提取未使用的端口更好的方法,因为我必须指定字符串的确切起始位置和结束位置来提取端口,因此其他配置文件具有不同数量的未使用端口,而我使用的子字符串不起作用。感谢advanced的帮助

这是一个实用的解决方案,它使用PowerShell的
-split
操作符的一元形式:

# Get the block of relevant lines as a single string.
$unusedVlan = if ((Get-Content -raw c:\config.txt) -match '(?ms)^999.*?(?=\r?\n\S|\Z)') 
  { $Matches[0]} 

# Split the string into an array of token by whitespace,
# remove all "," instances,
# and skip the first 3 tokens 
# (the tokens *before* the port numbers, namely '999', 'Unused', 'active')
# The result is an *array* of all port numbers: @( 'Fa0/10', 'Fa0/11', ... )
$unusedPorts = (-split $unusedVlan) -replace ',' | Select-Object -Skip 3

# Output the array
$unusedPorts

请尝试以下正则表达式以获取所有匹配项:
(?sm)(?这将给出与使用“(?sm)(?=^999.*?(?=\r?\n\S |\Z)相同的结果)“。我正在寻找一种比使用子字符串更好的方法,根据不同的配置文件动态提取未使用的端口号。这些配置文件可能有不同数量的未使用端口。创建时,它起作用了,但如果我取出-raw,它就不起作用了。我的问题是,我想获取内容,读取文件夹中的所有配置文件,并选择字符串。”要提取主机名、版本号等,如果我使用-raw,则选择字符串不起作用。@Justin:很高兴听到它。关于剩余问题:我没有完全理解,但我建议你问一个新问题-完成后,请在这里ping我。