Board logo

标题: [问题求助] 求PowerShell更简单的正则解决方法 [打印本页]

作者: 小白龙    时间: 2023-12-27 16:40     标题: 求PowerShell更简单的正则解决方法

功能已经实现的差不多了, 就是最后$s2Array的结果少了德国
另外,感觉用正则应该还有更简单的方法, 求路过大佬指导

功能描述如下:
#如果$s变量的文本的第1行是否以●●开头且行内包含★ 则:获取●●和第1个★之间的文本存到变量$s1
#再获取第1个★之后的文本存到$s2,并以★为分割符将文本分割成数组$s2Array, 注意每组文本前后的空格要删除
#尽量使用[regex]::Matches()方法结合合理的正则表达式来实现
  1. $s = @'
  2. ●● 中国 ★ 美国 ★ 日本 ★ 德国
  3. 你好
  4. 世界
  5. hello
  6. world
  7. '@
  8. # 按照规则提取$s1和$s2
  9. if ($s -match "(?m)^●●.*★")
  10. {
  11. $s1 = [regex]::Matches($matches[0], '(?<=●●).*?(?=★)')[0].Value.Trim()
  12. $s2 = [regex]::Matches($matches[0], '(?<=★).*')[0].Value.Trim()
  13. # 以★为分割符将文本分割成数组,并删除前后的空格
  14. $s2Array = $s2 -split "★" | ForEach-Object { $_.Trim() }
  15. # 输出结果
  16. $s1
  17. '--------'
  18. $s2Array
  19. }
复制代码

作者: buyiyang    时间: 2023-12-27 18:24

if ($s -match "(?m)^●●.*★.*")
  1. $sArray = $s -split '\n'
  2. if ($sArray[0] -match '(?m)^●●(?<s1>.*?)★(?<s2>.*)') {
  3.     $s1 = $matches['s1'].Trim()
  4.     $s2 = $matches['s2'].Trim() -replace '(\s*)★(\s*)', "`n"
  5.     $s1
  6.     '------'
  7.     $s2
  8. }
复制代码

作者: Five66    时间: 2023-12-28 08:04

不知行否
  1. $s = @'
  2. ●● 中国 ★ 美国 ★ 日本 ★ 德国
  3. ★ 法国
  4. ★ 韩国
  5. 你好
  6. 世界
  7. hello
  8. world
  9. '@
  10. $m=[regex]::match($s,'(?m)^●●[^★]+(?=★)')
  11. if($m.Success){
  12. $s1=$m.value.Substring(2).trim()
  13. #跨行
  14. $r=[regex]::new('([\r\n\s]?★[^★\r\n]+)+',[Text.RegularExpressions.RegexOptions]16)
  15. $s2=$r.Match($s,$m.Index+$m.Length).value.replace("`r`n",'').split('★').where{$_}.trim()
  16. #不跨行
  17. #$r=[regex]::new('..*',[Text.RegularExpressions.RegexOptions]2)
  18. #$s2=$r.Match($s,$m.Index+$m.Length).value.split('★').where{$_}.trim()
  19. $s1
  20. '------'
  21. $s2
  22. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2