标题: [问题求助] PowerShell从多行字符串中提取变量名遇到的问题 [打印本页]
作者: 5i365 时间: 2022-11-1 18:54 标题: PowerShell从多行字符串中提取变量名遇到的问题
我想从多行字符串中提取所有的变量名, 下面代码中的正则有点问题, 请高手指引, 提前感谢!
正确结果应该如下: 现在代码的结果中少了红色字的两个变量
$arr
$ii
$p12
$pro
$s
$s1
$s2
$x- $s = @'
- $p12 = 'abc';
- $pro=New-Object System.Diag.Pr;
- $pro.Start = $false;
- $pro.Start.Red = $true; $s="hello"; $s1="world"; $s2="china"
- for ($x = 1; $x -lt 10; $x = $x + 1)
- {
- echo $x
- $s="word"
- }
- $arr = "Red", "Orange", "Green", "White", "Blue", "Indigo", "black", "Violet"
- for ($ii = 0; $ii -lt $arr.Length; $ii++)
- {
- $arr[$ii]
- }
- '@
- $s | sls '(?m)(\$[a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*.+' -AllMatches |
- foreach{
- $_.matches |
- foreach{
- $_.Groups[1].Value
- }
- } |
- sort -Unique
复制代码
作者: pd1 时间: 2022-11-1 19:48
- $s = @'
- $p12 = 'abc';
- $pro=New-Object System.Diag.Pr;
- $pro.Start = $false;
- $pro.Start.Red = $true; $s="hello"; $s1="world"; $s2="china"
- for ($x = 1; $x -lt 10; $x = $x + 1)
- {
- echo $x
- $s="word"
- }
- $arr = "Red", "Orange", "Green", "White", "Blue", "Indigo", "black", "Violet"
- for ($ii = 0; $ii -lt $arr.Length; $ii++)
- {
- $arr[$ii]
- }
- '@
- $reg=[regex]"\$[a-zA-Z0-9_]+"
- $reg.Matches($s)|select -Unique |?{$_.Value -ne '$false' -and $_.Value -ne '$true'}|%{$_.Value}
复制代码
作者: 5i365 时间: 2022-11-1 20:12
本帖最后由 5i365 于 2022-11-1 20:13 编辑
回复 2# pd1
多谢大侠支招, 但是有局限性,
例如下面我又在前面加了两行, 这两行不应该匹配到, 第一行中$abc是字符串, 第二行也不想匹配到, 所以还是得需要=号来约束一下
- $s = @'
- "$abc"
- $123
- $p12 = 'abc';
- $pro=New-Object System.Diag.Pr;
- $pro.Start = $false;
- $pro.Start.Red = $true; $s="hello"; $s1="world"; $s2="china"
- for ($x = 1; $x -lt 10; $x = $x + 1)
- {
- echo $x
- $s="word"
- }
- $arr = "Red", "Orange", "Green", "White", "Blue", "Indigo", "black", "Violet"
- for ($ii = 0; $ii -lt $arr.Length; $ii++)
- {
- $arr[$ii]
- }
- '@
复制代码
作者: 5i365 时间: 2022-11-1 20:16
我最上面的代码用上了sls, 是因为我看过到一篇文章, 这个sls命令比其它的方法速度都要快, 具体原因不明
作者: 5i365 时间: 2022-11-1 20:27
找了点规律, 同时满足下面三个条件的正则就能匹配出来
-----------------------------------------------------------
变量名的$之前可能有 ( 或 ; 或空格
变量名到=之间不能有 .
变量名中第一个字符不能是数字
作者: pd1 时间: 2022-11-1 21:34
回复 3# 5i365
所以举例子就要全面一点啊,用=也不一定吧 后面可以直接接管道符|的,没有=
作者: 5i365 时间: 2022-11-1 21:43
回复 6# pd1
不好意思, 这个例子, 就是自己给自己出题, 感觉有趣就尝试一下
如果后面有管道符, 感觉这个变量可能在前面赋值过了
作者: pd1 时间: 2022-11-1 22:04
回复 7# 5i365
$a=dir *.txt;foreach($b in $a){write-host "前面是不是有个变量出不来"}
作者: 5i365 时间: 2022-11-2 07:51
回复 8# pd1
多谢指出:
变量名的$之前可能有 ( 或 ; 或空格
变量名后可能有 in 或 = 且到=之间不能有 .
变量名中第一个字符不能是数字
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |