使用 PowerShell 拆分段落以分隔一位或两位数字
Split a paragraph to separate one or two digit numbers with PowerShell
我正在尝试将 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."
这是我尝试拆分的代码和 select 数字:
[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)")
我该如何解决这个错误?
您可以使用
[regex]::Split($p,"(?<![\d\s])(\d{1,2})(?!\d)\s*")
它只匹配和捕获一个或两个既没有跟在另一个数字后面也没有跟在另一个数字前面,并且前面没有任何空白字符的数字。任何尾随空格都与 \s*
匹配,因此从添加到结果数组的项目中删除。
详情
(?<![\d\s])
- 如果在当前位置的左侧立即有一个数字或空格 ,则匹配失败的否定后视
(\d{1,2})
- 第 1 组:一位或两位数
(?!\d)
- 后面不能跟另一个数字(如果它的模式与当前位置的右侧立即匹配,则它是一个否定的前瞻性匹配失败)
\s*
- 0+ 个空格。
我正在尝试将 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."
这是我尝试拆分的代码和 select 数字:
[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)")
我该如何解决这个错误?
您可以使用
[regex]::Split($p,"(?<![\d\s])(\d{1,2})(?!\d)\s*")
它只匹配和捕获一个或两个既没有跟在另一个数字后面也没有跟在另一个数字前面,并且前面没有任何空白字符的数字。任何尾随空格都与 \s*
匹配,因此从添加到结果数组的项目中删除。
详情
(?<![\d\s])
- 如果在当前位置的左侧立即有一个数字或空格 ,则匹配失败的否定后视
(\d{1,2})
- 第 1 组:一位或两位数(?!\d)
- 后面不能跟另一个数字(如果它的模式与当前位置的右侧立即匹配,则它是一个否定的前瞻性匹配失败)\s*
- 0+ 个空格。