如何修复PowerShell Core 7中特定域名正则表达式匹配失败问题?
PowerShell Core 7正则表达式修复:匹配符合规则的三/四段主机地址
需求说明
需要编写正则表达式满足以下要求:
- 匹配三或四段结构的主机地址
- 最后两段必须是
specificPartA.specificPartB或specificPartC.specificPartD其中之一 - 前一段或两段前缀不能包含数字
匹配示例
foo.specificPartA.specificPartB- 匹配foo.bar.specificPartA.specificPartB- 匹配foo.specificPartC.specificPartD- 匹配foo.bar.specificPartC.specificPartD- 匹配
不匹配示例
foo1.specificPartC.specificPartD- 不匹配(前缀含数字)foo1.bar.specificPartC.specificPartD- 不匹配(前缀含数字)
当前问题
使用的正则表达式为:
"[^0-9]+\.[^0-9]+\.(specificPartA.specificPartB|specificPartC.specificPartD)"
测试三段域名(如foo.specificPartA.specificPartB)时返回不匹配,执行代码如下:
if ("foo.specificPartA.specificPartB" -match "[^0-9]+\.[^0-9]+\.(specificPartA.specificPartB|specificPartC.specificPartD)") { write-output "matches" } else { Write-Output "doesn't match" }
问题原因
原正则强制要求两段不含数字的前缀([^0-9]+\.[^0-9]+),但三段域名只有一段前缀,因此无法匹配。另外原正则未转义后缀中的点号(.在正则中是通配符,会匹配任意字符),也未限定字符串首尾,可能出现部分匹配的问题。
修复后的正则表达式
"^([^0-9]+\.)?[^0-9]+\.(specificPartA\.specificPartB|specificPartC\.specificPartD)$"
正则解析
^:锚定字符串开头,避免从中间匹配([^0-9]+\.)?:可选的第一段前缀(不含数字,带点号),?表示该部分可出现0或1次,适配三段域名的情况[^0-9]+:必填的一段前缀(不含数字),三段域名时是唯一前缀,四段时是第二段前缀\.:转义后的点号,匹配实际的点分隔符(specificPartA\.specificPartB|specificPartC\.specificPartD):精确匹配指定的后缀组合,点号同样需要转义$:锚定字符串结尾,避免匹配更长字符串的一部分
测试验证
三段域名测试
if ("foo.specificPartA.specificPartB" -match "^([^0-9]+\.)?[^0-9]+\.(specificPartA\.specificPartB|specificPartC\.specificPartD)$") { write-output "matches" } else { Write-Output "doesn't match" }
输出:matches
四段域名测试
if ("foo.bar.specificPartC.specificPartD" -match "^([^0-9]+\.)?[^0-9]+\.(specificPartA\.specificPartB|specificPartC\.specificPartD)$") { write-output "matches" } else { Write-Output "doesn't match" }
输出:matches
含数字前缀测试
if ("foo1.specificPartC.specificPartD" -match "^([^0-9]+\.)?[^0-9]+\.(specificPartA\.specificPartB|specificPartC\.specificPartD)$") { write-output "matches" } else { Write-Output "doesn't match" }
输出:doesn't match
内容的提问来源于stack exchange,提问作者John Weirich
相关产品推荐
相关产品推荐

