本帖最后由 flashercs 于 2022-8-30 15:52 编辑
回复 12# 小白龙
标签/内容 相互检测是太复杂- [Collections.ArrayList]$B = @() #存标签
- [Collections.ArrayList]$C = @() #存内容
-
- [Collections.ArrayList]$CLocal = @() #存内容Local
- [Collections.ArrayList]$keysInContent = @() #keys in content
- $dicLabelCtr = @{} #标签个数统计
- # $dicLabelLocal = @{} #标签个数统计: {称呼 =称呼2}
- $dicLabelLocal4B = [ordered]@{} #{标签 = Line}
- $reLabel = [regex]'┋([^,]*),(\s*)' #标签正则
- $reContent = [regex]'┃([^┃]*)┃' #内容正则
- # 替换label
- $sbLabel = {
- param([System.Text.RegularExpressions.Match]$m)
- $k = $m.Groups[1].Value
- if ($dicLabelCtr.ContainsKey($k)) {
- $ctr = (++$dicLabelCtr[$k])
- # $dicLabelLocal[$k] = "$k$ctr"
- "┃Y_$k$ctr┃$($m.Groups[2].Value)$k$ctr[]"
- } else {
- $dicLabelCtr[$k] = 1
- # $dicLabelLocal[$k] = "$k"
- "┃Y_$k┃$($m.Groups[2].Value)$k[]"
- }
- }
- # 替换内容
- $sbContent = {
- param([System.Text.RegularExpressions.Match]$m)
- $k = $m.Groups[1].Value
- if ($dicLabelLocal4B.Contains($k)) {
- [void]$keysInContent.Add($k)
- if ($dicLabelCtr.ContainsKey($k)) {
- "┃Y_${k}$($dicLabelCtr[$k]+1)┃"
- } else {
- "┃Y_${k}┃"
- }
- } else {
- "┃N_$k┃"
- }
- }
- $A = @'
- ┋国家, 中国, 美国, 日本
- ┋城市, 北京, 上海, 广州
- ┋大理, 三亚, 海南
- 我的名字是 ┃名字┃, 我的国家是 ┃国家┃, 我的年龄是┃年龄┃, 我家住在┃城市┃!
-
- ┋称呼, 先生, 大姐, 女士
- ┋呼呼, 先生, 大姐, 女士
- 你好┃称呼┃别来无恙.
-
- ┋称呼, 先生, 大姐
- 你好┃称呼┃, 我的打印机品牌是┃品牌┃.
- '@
-
- #将变量$a的内容进行处理:
- #┋开头的标签行:分离、处理后保存到变量$B
- #余下的内容:处理后保存到变量$C
- $stack = 0 #content
- $A -split '\r\n' | ForEach-Object {
- if ($stack -eq 0) {
- if ($_.StartsWith("┋")) {
- $stack = 1
- # procossing prev section
- for ($i = 0; $i -lt $CLocal.Count; $i++) {
- $CLocal[$i] = $reContent.Replace($CLocal[$i], $sbContent)
- }
- foreach ($key in @($dicLabelLocal4B.Keys)) {
- if (-not $keysInContent.Contains($key)) {
- [void]$C.Add($dicLabelLocal4B[$key])
- $dicLabelLocal4B.Remove($key)
- } else {
- [void]$B.Add(($reLabel.Replace($dicLabelLocal4B[$key], $sbLabel) -replace ',\s*', '[]'))
- }
- }
- [void]$C.AddRange($CLocal)
- $CLocal.Clear()
- $keysInContent.Clear()
- $dicLabelLocal4B.Clear()
- # next section
- $m = $reLabel.Match($_)
- if ($m.Success) {
- $dicLabelLocal4B[$m.Groups[1].Value] = $_
- } else {
- $dicLabelLocal4B[$_] = $_
- }
- } else {
- [void]$CLocal.Add($_)
- }
- } else {
- # stack=1
- if ($_.StartsWith("┋")) {
- $m = $reLabel.Match($_)
- if ($m.Success) {
- $dicLabelLocal4B[$m.Groups[1].Value] = $_
- } else {
- $dicLabelLocal4B[$_] = $_
- }
- } else {
- $stack = 0
- [void]$CLocal.Add($_)
- }
- }
- }
- # procossing prev section
- for ($i = 0; $i -lt $CLocal.Count; $i++) {
- $CLocal[$i] = $reContent.Replace($CLocal[$i], $sbContent)
- }
- foreach ($key in @($dicLabelLocal4B.Keys)) {
- if (-not $keysInContent.Contains($key)) {
- [void]$C.Add($dicLabelLocal4B[$key])
- $dicLabelLocal4B.Remove($key)
- } else {
- [void]$B.Add(($reLabel.Replace($dicLabelLocal4B[$key], $sbLabel) -replace ',\s*', '[]'))
- }
- }
- [void]$C.AddRange($CLocal)
- $CLocal.Clear()
- $keysInContent.Clear()
- $dicLabelLocal4B.Clear()
-
- $B
- $C
复制代码
|