1

我有这个简单的要求:

  • 必须以字母 (az) 开头
  • 休息可以是数字 az 和下划线
  • 没有大写字母
  • 长度 > 3 且 < 9

这返回 false,但应该为 true

'h8euj_' -match "(^[a-z][a-z0-9_]+)(i){4,8}"

怎么了 ?

4

2 回答 2

3

用于-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
于 2021-01-21T21:21:31.723 回答
0

Ryszard Czech 的有用答案显示了最佳解决方案。

至于你尝试的正则表达式,(^[a-z][a-z0-9_]+)(i){4,8}

  • 以_ {4,8}_ (...)_ ^_ (i)_ ^_ _ _输入的开始。

    • 此外,您通过放置在捕获组中错误地应用了一个额外的量词+,它有效地匹配前面的子表达式[a-z0-9_]一次或多次,并且没有限制匹配的数量。
  • 鉴于只有第一个字符必须限制为 betweenaz( [a-z]),只有后续的[a-z0-9_]子表达式必须被量化,即 between 3and次,以获得and字符7的总长度。48

  • (i)看起来像是尝试使用指定不区分大小写匹配i内联正则表达式选项。

    • 但是,内联正则表达式选项需要包含 in (?<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

于 2021-01-22T02:04:37.037 回答