拆分段落以使用PowerShell分隔一位或两位数字

时间:2018-02-21 16:49:06

标签: html regex powershell word

我尝试将HTML文件中的某些文本解析并格式化为Word。我这样做是通过将每个段落捕获到一个数组中,然后一次一个段落将其写入word文档。但是,整个文本中都有上标引用。我正在寻找一种方法来在新的Word文件中标记这些引用,并认为我会使用正则表达式和拆分来使这项工作。这是一个示例段落:

$p = "This is an example sentence.1 The number is a reference note that should be superscripted and can be one or two digits long."

以下是我尝试拆分并选择数字的代码:

[regex]::Split($p,"(\d{1,2})")

这适用于单位和双位数字。但是,如果有两个以上的数字,它仍会将其拆分,但会将额外的数字移动到下一行。像这样:

This is an example sentence.
10

0
The number is a reference note that should be superscripted and can be one or two digits long.

这一点非常重要,因为文字中有时会有更大的数字(3-10位),我不想分开。我的目标是使用一个带有参考注释编号的文本块并分离注释,这样当我将其写入Word文件时,我可以对它们执行格式化功能。像这样(未经测试):

$paragraphs | % {
    $a = @([regex]::Split($_,"(\d{1,2})"))
    $a | % {
        $text = $_
        if ($text -match "(\d{1,2})")
        {
            $objSelection.Font.SuperScript = 1
            $objSelection.TypeText("$text")
            $objSelection.Font.SuperScript = 0
        }
        Else
        {
            $objSelection.Style="Normal"
            $objSelection.TypeText("$text")
        }

    }
        $text = "`v"
        $objSelection.TypeText("$text")
        $objSelection.TypeParagraph()
}

修改 当我使用上面的循环在其自己的脚本中测试它时,以下正则表达式有效:

"(?<![\d\s])(\d{1,2})(?!\d)"

但是,当我在父脚本中运行它时,我收到以下错误:

Cannot find an overload for "Split" and the argument count: "2"
$a = [regex]::Split($_,"(?<![\d\s])(\d{1,2})(?!\d)")

我该如何解决此错误?

1 个答案:

答案 0 :(得分:1)

您可以使用

[regex]::Split($p,"(?<![\d\s])(\d{1,2})(?!\d)\s*")

它只匹配并捕获一个或两个数字,这些数字既没有跟随也没有前面跟另一个数字,并且前面没有任何空白字符。任何尾随空格都与\s*匹配,因此从添加到结果数组中的项目中删除。

请参阅this regex demo

enter image description here

<强>详情

  • (?<![\d\s]) - 如果在当前位置的左侧立即有一个数字或一个空格,则会导致匹配失败的负面后卫
  • (\d{1,2}) - 第1组:一位或两位数
  • (?!\d) - 无法跟随另一个数字(如果其模式立即与当前位置的右侧匹配,那么这是一个未通过匹配的否定前瞻)
  • \s* - 0+空格。