我尝试将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)")
我该如何解决此错误?
答案 0 :(得分:1)
您可以使用
[regex]::Split($p,"(?<![\d\s])(\d{1,2})(?!\d)\s*")
它只匹配并捕获一个或两个数字,这些数字既没有跟随也没有前面跟另一个数字,并且前面没有任何空白字符。任何尾随空格都与\s*
匹配,因此从添加到结果数组中的项目中删除。
请参阅this regex demo:
<强>详情
(?<![\d\s])
- 如果在当前位置的左侧立即有一个数字或一个空格,则会导致匹配失败的负面后卫(\d{1,2})
- 第1组:一位或两位数(?!\d)
- 无法跟随另一个数字(如果其模式立即与当前位置的右侧匹配,那么这是一个未通过匹配的否定前瞻)\s*
- 0+空格。