正则表达式文本块

时间:2016-04-14 18:16:42

标签: regex powershell

为了清晰起见,我希望将这个正则表达式格式化为多行。像这样:

$regexDatum = [regex] @"
^\<(?<TargetAddress>[0-9A-Fa-f][0-9A-Fa-f]),
(?<ReadStatus>\w\w),
(?<s1le>\d+),
(?<s1te>\d+),
(?<e1le>\d+),
(?<e1z>-{0,1}\d+),
(?<e1te>\d+),
(?<e2le>\d+),
(?<e2z>-{0,1}\d+),
(?<e2te>\d+),
(?<s2le>\d+),
(?<s2te>\d+),
"@

但我发现行尾的空格会引起问题,而反推似乎会使问题复杂化。因此,我被迫将所有内容放在一行 - 你好,专栏240 ......

大多数C编译器都允许我这样的东西(斜杠没有针对C编译器进行校正):

char[] regexDatum = "^\<(?<TargetAddress>[0-9A-Fa-f][0-9A-Fa-f]),"
    "(?<ReadStatus>\w\w),"
    "(?<s1le>\d+),"
    "(?<s1le>\d+),"
    "(?<s1te>\d+),"
    "(?\<e1le>\d+),"
    "(?<e1z>-{0,1}\d+),"
    "(?<e1te>\d+),"
    "(?<e2le>\d+),"
    "(?<e2z>-{0,1}\d+),"
    "(?<e2te>\d+),"
    "(?<s2le>\d+),"
    "(?<s2te>\d+),"

在PowerShell中是否有正确的方法来终止/继续文本块中的行?

奖金问题: 正则表达式模式字符串中是否允许注释? (例如Perl允许(?# my comments)/x修饰符)

1 个答案:

答案 0 :(得分:3)

字符串连接是实现所需目标的一种方法:

$regexDatum = [regex](
  '^\<(?<TargetAddress>[0-9A-Fa-f][0-9A-Fa-f]),' +
  '(?<ReadStatus>\w\w),' +
  '(?<s1le>\d+),' +
  '(?<s1te>\d+),' +
  '(?<e1le>\d+),' +
  '(?<e1z>-{0,1}\d+),' +
  '(?<e1te>\d+),' +
  '(?<e2le>\d+),' +
  '(?<e2z>-{0,1}\d+),' +
  '(?<e2te>\d+),' +
  '(?<s2le>\d+),' +
  '(?<s2te>\d+),'
)

但是,使用IgnorePatternWhitespace建议的regex option @PetSerAl可以说是更好的方法,因为它允许在字符串中缩进和注释表达式:

$regexDatum = @"
  ^\<(?<TargetAddress>[0-9A-Fa-f][0-9A-Fa-f]),
  (?<ReadStatus>\w\w),
  (?<s1le>\d+),
  (?<s1te>\d+),          # some comment
  (?<e1le>\d+),
  (?<e1z>-{0,1}\d+),     # other comment
  (?<e1te>\d+),
  (?<e2le>\d+),          # unimportant
  (?<e2z>-{0,1}\d+),
  (?<e2te>\d+),
  (?<s2le>\d+),
  (?<s2te>\d+),
"@

[regex]::Match($str, $regexDatum, [Text.RegularExpressions.RegexOptions]::IgnorePatternWhitespace)