我有这个简单的要求:
- 必须以字母 (az) 开头
- 休息可以是数字 az 和下划线
- 没有大写字母
- 长度 > 3 且 < 9
这返回 false,但应该为 true
'h8euj_' -match "(^[a-z][a-z0-9_]+)(i){4,8}"
怎么了 ?
我有这个简单的要求:
这返回 false,但应该为 true
'h8euj_' -match "(^[a-z][a-z0-9_]+)(i){4,8}"
怎么了 ?
用于-cmatch
区分大小写的匹配:
$str -cmatch '^[a-z][a-z0-9_]{3,7}$'
见证明
解释
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
[a-z] any character of: 'a' to 'z'
--------------------------------------------------------------------------------
[a-z0-9_]{3,7} any character of: 'a' to 'z', '0' to '9',
'_' (between 3 and 7 times (matching the
most amount possible))
--------------------------------------------------------------------------------
$ before an optional \n, and the end of the
string
Ryszard Czech 的有用答案显示了最佳解决方案。
至于你尝试的正则表达式,(^[a-z][a-z0-9_]+)(i){4,8}
:
在以_ {4,8}
_ (...)
_ ^
_ (i)
_ ^
_ _ _输入的开始。
+
,它有效地匹配前面的子表达式[a-z0-9_]
一次或多次,并且没有限制匹配的数量。鉴于只有第一个字符必须限制为 betweena
和z
( [a-z]
),只有后续的[a-z0-9_]
子表达式必须被量化,即 between 3
and次,以获得and字符7
的总长度。4
8
(i)
看起来像是尝试使用指定不区分大小写匹配i
的内联正则表达式选项。
(?<option-letters>)
,其中<option-letters>
是一个或多个选项字母的字符串,可选前缀用于关闭-
选项。(...)
正则表达式使用不区分大小写的匹配,请放置在start处。(?i)
所以:
'h8euj_' -match '(?i)^[a-z][a-z0-9_]{3,7}'
注意:附加输入结束锚点$
以确保输入字符串作为一个整体与正则表达式匹配。
但是,正如 Ryszard 的回答所示,使用运算符的-cmatch
变体-match
隐式导致整个正则表达式的匹配区分大小写。
其他基于字符串的 PowerShell 运算符也为区分大小写c
的操作提供前缀变体,因为它们的默认行为是不区分大小写的。
为了明确强调不区分大小写的意图,您还可以使用i
-prefixed 变体,它们是运算符基本名称的有效别名;例如,-imatch
实际上与 相同-match
。