20. PoweShell - 正则表达式
? PowerShell 正则表达式:三大类元素 字符:一个单独字符,或一个字符集合构成的字符串; 限定符:允许你在模式中决定字符或者字符串出现的频率; 定位符:允许你决定模式是否是一个独立的单词,或者出现的位置必须在句子的开头还是结尾;
限定符 上面表格中列出的每个通配符,可以代表一个确定的字符。使用限定符,可以精确地确定字符的出现频率。例如”d{1,3}”代表一个数字字符出现1到3次。
? PowerShell 正则表达式:四种不同模式 文字字符:”abc”确切的匹配”abc”字符串 转义字符:识别特殊字符如反斜杠,中括号,小括号;如”[abc]”可以识别”abc” 预定义字符:类似占位符,可以识别某一类字符,如”d”可以识别0-9数字 自定义通配符: 包含在中括号中的通配符,如”[a-d]”可以识别a,b,c,d之间的任意字符,如果要排除这些字符,可以使用”[^a-d]”
? PowerShell 正则表达式:同时搜索不同的词语 1. 使用限定符“?”来标记这些词语作为可选字符。非常简单,把“?”放在可选字符后面即可。这样“?”前的字符就变成了可选字符,而不是非得出现。 "color" -match "colou?r" True "colour" -match "colou?r" True
2. 如果你想标记更多的连续字符作为可选,可以把这些字符放置圆括号中建立子表达式。下面的子表达可以同时识别“Nov”和“November”: "Nov" -match "bNov(ember)?b" True "November" -match "bNov(ember)?b" True
3. 如果你想使用多个可选的搜索词语,可以使用“或”操作符“|”: "Bob and Ted" -match "Alice|Bob" True
4. 如果你想将搜索的词语和固定文本结合在一起,作为可选,仍然可以使用子表达式: "Peter and Bob" -match "and (Bob|Willy)" True # 没有搜索到 "and Bob": "Bob and Peter" -match "and (Bob|Willy)" False
? PowerShell 正则表达式:大小写敏感 # -match 大小写不敏感: "hello" -match "heLLO" True # -cmatch 大小写敏感: "hello" -cmatch "heLLO" False #使用.NET FrameWork的对象RegEx,来自动的在大小写敏感与不敏感之间切换 PS > [regex]::matches("test","TEST","IgnoreCase") Groups : {test} Success : True Captures : {test} Index : 0 Length : 4 Value : test
? PowerShell 正则表达式:删除多余的空格 #使用正则表达式可以完成一些日常任务,比如一处一个字符串中多余的白空格。模式需要描述一个空格(字符:“s”)至少出现两次(限定符:“{2,}”)。然后以一个正常的单空格字符替换。
实例:
"太多 太多的 空格怎么才能减少 " -replace "s{2,}"," " # 太多太多的空格怎么才能减少
? PowerShell 正则表达式:搜索和移除重复的单词 #怎样才能移除文本中多余的单词。这里,仍旧可以再次使用空格。模式可以这样定义: “b(w+)(s+1){1,}b” 模式会搜索一个单词(以“b”定位),它由一个单词组成(字符“w” 和限定符“+”),白空格紧随以后(字符“s”和限定符“?”)。该模式中,白空格字符和将要被替换的单词必须至少出现一次(至少一次或者更多次,使用限定符“{1,}”)。整个模式会被第一次出现的反向引用给替换掉,也就是位于第一个的单词。
实例:
"太多太多的话我还没有说,太多太多太多的理由值得你留下" -replace "b(w+)(s+1){1,}b",'$1' #太多的话我还没有说,太多的理由值得你留下
? PowerShell 正则表达式:非捕获组 (expression) 是一种简单的子表达式
#示例一 PS> 'PSTips Net' -match 'PS(Tips)b' True PS> $Matches Name Value ---- ----- 1 Tips 0 PSTips
#示例二 PS> 'PSTips Net' -match 'PS(?:Tips)b' True PS> $Matches Name Value ---- ----- 0 PSTips
? PowerShell 正则表达式:在文本行的开始插入字符 # “替换串”可以由多行文本中的多个实例组成。例如,在你平时回复一封邮件时,你可能在新邮件中会通过在行首添加 “>” 符号来引用原邮件的中的内容。正则表达式就可以做这样的标记。 然而,要完成它,你可能得稍微了解一点“多行”模式。通常,该模式是关闭的,此时限定符”^”代表文本的开始,”$”代表文本的结束。要让这两个限定符可以代表文本行的开始和文本行的结束,必须使用”(?m)”来开启“多行”模式。只有这样,?replace 才会在每个单独的文本行之间替换模式。在“多行”模式开启后,限定符”^” 和 “A”,还有”$” and “Z”会顿时拥有不同的表现。 ”A”仍然会标志文本的开始,而”^”则会标志文本行的开始。”Z”仍然会标志文本的结尾,而”$”则会标志文本行结尾。
$text = @" 这是一段文本, 我想在回复的邮件中引用它, 所以我在每行的开始追加了">" 符号。 "@
结果: 这是一段文本, 我想在回复的邮件中引用它, 所以我在每行的开始追加了">" 符号。
# 通常,-replace 没有工作在多行模式. # 鉴于此,只有第一行的开始被替换了: $text -replace "^","> "
结果: > 这是一段文本, 我想在回复的邮件中引用它, 所以我在每行的开始追加了">" 符号。
# 如果你开启了多行模式,替换串则会多行文本中起作用: $text -replace "(?m)^","> "
结果: > 这是一段文本, > 我想在回复的邮件中引用它, > 所以我在每行的开始追加了">" 符号。
# 你也可以使用RegEx对象来完成多行替换, # 不过得显式指定多行模式 [regex]::Replace($text,"^",">",[System.Text.RegularExpressions.RegexOptions]::Multiline)
结果: > 这是一段文本, > 我想在回复的邮件中引用它, > 所以我在每行的开始追加了">" 符号。
# 在多行模式中 A 仍旧代表文本的开始,^代表行的开始 # 这就是为什么下面的方法只能替换第一行的开始 [regex]::Replace($text,"A",[System.Text.RegularExpressions.RegexOptions]::Multiline)
结果: > 这是一段文本, 我想在回复的邮件中引用它, 所以我在每行的开始追加了">" 符号。
? PowerShell 正则表达式:替换字符串 #实例一:-replace操作符,用来替换字符串中的字串 "Hello,PowerShell" -replace "PowerShell","www.pstips.net" #Hello,www.pstips.net #实例二:-replace操作符,用来将多个类似的词语替换成同一个词语; "Mr. Miller and Mrs. Meyer" -replace "(Mr.|Mrs.)","Our client" # Our client Miller and Our client. Meyer
备注:你可以在括号中输入任意的词语,多个词语之间用“|”隔开,这样所有的词语都会被指定的字符串替换掉。
? PowerShell 正则表达式:搜索字符串片段 #举一个例子演示怎样通过正则表达式轻松的搜索字符串片段。下面的的脚本会匹配位于两个特定单词中的字串,并且字符的长度介于1到6之间。
"Find word segments from start to end" -match "bstartW+(?:w+W+){1,6}?endb" # True $matches[0] # start to end
"Find word segments from start to a b c d e f g end" -match "bstartW+(?:w+W+){1,6}?endb" # False $matches[0] # start to end
? PowerShell 正则表达式:贪婪与非贪婪匹配 实例一:默认,正则表达式属于“贪婪”模式。在搜索到Feb后会继续贪婪地搜索更多符合模式的的字符。如果可以整个文本会返回。 "Feb" -match "Feb(ruary)?" #True $matches[0] #Feb "February" -match "Feb(ruary)?" #True $matches[0] #February
实例二:“??”限定符做的,它会将正则表达式转换成“非贪婪”模式,一旦他识别到一个模式,就会立即返回,不再会检查可选的子表达式是否匹配。 "Feb" -match "Feb(ruary)??" #True $matches[0] #Feb "February" -match "Feb(ruary)??" #True $matches[0] #Feb 参考: http://www.pstips.net/powershell-online-tutorials/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |