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

3

有没有办法将正则表达式分成多行,以便它不会超出我的编辑器的范围?

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
}

当我尝试以下操作时,它不起作用。 我还尝试过用 `` 包围它以及其他所有技巧,但是似乎都不起作用,我也找不到有关此事的其他信息(也许我的搜索技能很差)。
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
}
2个回答

5
你可以使用正则表达式选项 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
}

此外,请注意我已将!(... -match ...)翻译成了更简单的 ... -notmatch ...;大多数PowerShell运算符都有带有-not*否定形式。 此选项的目的是通过以下方式促进正则表达式的可读性
  • 允许您使用空格进行人性化格式化,而不使这些空格成为匹配内容的一部分。您想匹配的空格必须要明确标示,例如使用[ ]\s

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

一个简单的例子:
# Yields $true
'foo1' -match '(?x)
  fo+  # word part
  \d?  # optional trailing digit
  $    # and nothing else
'

3

实现你所需的最简单方法之一是使用多行字符串并从字符串中删除回车符和换行符。

最终结果仍是你原来拥有的长字符串,但它允许你垂直地分割它,从而避免水平滚动。

$str = @'
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
'@ -replace "\r?\n", ''


if (!($_ -match $str)) {
    # stuff
}

参考文献

关于特殊字符 (`r`n)

关于引用规则(多行字符串)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接