将长正则表达式拆分为多行?

12s*_*w12 3 regex powershell

有什么方法可以将正则表达式拆分为多行,这样它就不会超出编辑器的末尾?

if (!($_ -match 'e_eld\.s|od_eld\.|oe_eld\.s|of_eld\.s|og_eld\.s|1c_eld\.s|2c_eld\.s|3c_eld\.s|4c_eld\.s|1c_eld\.s|o2_eld\.s|o3_eld\.s|o4_eld\.s|o5_eld\.s'))
{
    # stuff
}
Run Code Online (Sandbox Code Playgroud)

当我尝试执行以下操作时,它不起作用。我也试过用`` 和所有其他技巧围绕它,但似乎没有任何效果,我找不到其他任何关于此的信息(也许我的搜索技巧很差)。

if (!($_ -match 'e_eld\.s|
                 od_eld\.s|
                 oe_eld\.s|
                 of_eld\.s|
                 og_eld\.s|
                 1c_eld\.s|
                 2c_eld\.s|
                 3c_eld\.s|
                 4c_eld\.s|
                 1c_eld\.s|
                 o2_eld\.s|
                 o3_eld\.s|
                 o4_eld\.s|
                 o5_eld\.s'))
{
    # stuff
}
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 6

您可以通过其内联形式使用IgnorePatternWhitespace正则表达式选项(?x)

if ($_ -notmatch '(?x)
                  e_eld\.s|
                  od_eld\.s|
                  oe_eld\.s|
                  of_eld\.s|
                  og_eld\.s|
                  1c_eld\.s|
                  2c_eld\.s|
                  3c_eld\.s|
                  4c_eld\.s|
                  1c_eld\.s|
                  o2_eld\.s|
                  o3_eld\.s|
                  o4_eld\.s|
                  o5_eld\.s')
{
    # stuff
}
Run Code Online (Sandbox Code Playgroud)

另请注意,我已翻译!(... -match ...)成更简单的... -notmatch ...; 大多数PowerShell 运算符都使用-not*.

此选项目的是通过以下方式提高正则表达式可读性

  • 允许您使用空格进行人性化的格式化,而不会使空格成为要匹配的内容的一部分。您确实想要匹配的空格然后必须显式发出信号,例如 with , [ ], or \s

  • 启用(单行)注释,前缀为#; 然后,您必须逐字转义#字符。作为\#

一个简单的例子:

# Yields $true
'foo1' -match '(?x)
  fo+  # word part
  \d?  # optional trailing digit
  $    # and nothing else
'
Run Code Online (Sandbox Code Playgroud)