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

2hh7jdfx  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(178)

有没有办法将正则表达式拆分成多行,这样它就不会超出编辑器的结尾?

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
}
uplii1fm

uplii1fm1#

您可以使用**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 operators具有与-not*的否定形式。
此选项的目的是通过以下方式提升正则表达式的 * 可读性 *:

  • 允许您使用空格进行人性化的格式化,而不会使空格成为要匹配的内容的一部分。如果要匹配空白,则必须显式地发出信号,例如使用[ ]\s
  • 启用**(单行)* 注解 *,前缀为#**;然后你必须逐字转义#字符。如\#

一个简单的例子:

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

fd3cxomn2#

实现您所寻求的最简单的方法之一是使用多行字符串,并从字符串中删除回车符和新行字符。
最终结果将是相同的长字符串,但它将允许您垂直打破它,这样您就可以避免水平滚动。

$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
}

参考资料

About Special Charactersrn)
About Quoting Rules(多行字符串)

相关问题