Powershell - 从字符串中提取句子的最佳方法是什么
Powershell - What is the best way to extract sentences from string
我有很多行的文本结构是这样的。
Sentence a. Sentence b part 1 `r`n
sentence b part 2. Sentence c.`r`n
Sentence d. Sentence e. Sentence f. `r`n
....
我想将那些句子和部分提取到每个部分或句子的单个字符串数组中。
截至目前,我发现了这些东西。
第一种方式。
$mySentences = $lineFromTheText -split "(?<=\.)"
第二种方式。
$mySentences = [regex]::matches($lineFromTheText, "([^.?!]+[.?!])?([^.?!]*$)?") | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}
和第三个代码。
$mySentences = ($lineFromTheText | Select-String -Pattern "([^.?!]+[.?!])?([^.?!]*$)?" -AllMatches).Matches | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}
似乎所有这些代码对我来说都和我期望的一样,但我想知道在这么多代码中我应该使用哪些方式。我的意思是什么是最好的代码。
请告诉我知道。
谢谢
如果你想要最少的执行时间,你可以测量它。让我们 运行 每个解决方案 10000 次,看看需要多长时间:
$lineFromTheText = "Sentence d. Sentence e. Sentence f."
(Measure-Command {1..10000 | % {$mySentences = $lineFromTheText -split "(?<=\.)"}}).Ticks
(Measure-Command {1..10000 | % {$mySentences = [regex]::matches($lineFromTheText, "([^.?!]+[.?!])?([^.?!]*$)?") | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}}}).Ticks
(Measure-Command {1..10000 | % {$mySentences = ($lineFromTheText | Select-String -Pattern "([^.?!]+[.?!])?([^.?!]*$)?" -AllMatches).Matches | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}}}).Ticks
输出(示例):
1059468
14512767
20444350
看起来你的第一个解决方案最快,第三个解决方案最慢。
我有很多行的文本结构是这样的。
Sentence a. Sentence b part 1 `r`n
sentence b part 2. Sentence c.`r`n
Sentence d. Sentence e. Sentence f. `r`n
....
我想将那些句子和部分提取到每个部分或句子的单个字符串数组中。 截至目前,我发现了这些东西。
第一种方式。
$mySentences = $lineFromTheText -split "(?<=\.)"
第二种方式。
$mySentences = [regex]::matches($lineFromTheText, "([^.?!]+[.?!])?([^.?!]*$)?") | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}
和第三个代码。
$mySentences = ($lineFromTheText | Select-String -Pattern "([^.?!]+[.?!])?([^.?!]*$)?" -AllMatches).Matches | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}
似乎所有这些代码对我来说都和我期望的一样,但我想知道在这么多代码中我应该使用哪些方式。我的意思是什么是最好的代码。 请告诉我知道。 谢谢
如果你想要最少的执行时间,你可以测量它。让我们 运行 每个解决方案 10000 次,看看需要多长时间:
$lineFromTheText = "Sentence d. Sentence e. Sentence f."
(Measure-Command {1..10000 | % {$mySentences = $lineFromTheText -split "(?<=\.)"}}).Ticks
(Measure-Command {1..10000 | % {$mySentences = [regex]::matches($lineFromTheText, "([^.?!]+[.?!])?([^.?!]*$)?") | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}}}).Ticks
(Measure-Command {1..10000 | % {$mySentences = ($lineFromTheText | Select-String -Pattern "([^.?!]+[.?!])?([^.?!]*$)?" -AllMatches).Matches | % {$_.Groups[1,2].Value} | % { If (-not ($_ -eq "")) {$_}}}}).Ticks
输出(示例):
1059468
14512767
20444350
看起来你的第一个解决方案最快,第三个解决方案最慢。