[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 WHY 于 2022-12-3 10:12 编辑
  1. $s = @'
  2. ab $( ) :bub.Bub11
  3. - :TA_Fbv "T " * $q$\m.co
  4. 中国 ac :bub.Bub65 * a.b
  5. >windows - china * cdef
  6. 小 日本 japen :bub.Bub10 ;;c.e
  7. |
  8. ac ${ } :bub.Bub18
  9. <
  10. ZZ :bub.Bub26
  11. #bub Bub10 m ;;1 小日本
  12. 我之前序号是10
  13.   最后是3
  14. #bub Bub
  15. #bub Bub11 m
  16. 我之前序号是11
  17.   最后是1
  18. #bub Bub 11
  19. #bub Bub18 m ;;6
  20. 我之前序号是18
  21.   最后是4
  22. #bub Bub 4
  23. #bub Bub65 m ;;
  24. 我之前序号是18
  25.   最后是2
  26. '@
  27. $arr = [Collections.ArrayList](($s -split '(?:\r?\n)+#bub Bub\d+ m')[0] -split '\r?\n'); #上半部分
  28. $count = $arr.Count;
  29. $hash = @{};
  30. $global:n = 0;
  31. forEach( $m In [regex]::Matches($s, '(?im)^#bub Bub(\d+) m(?:(?!^#bub Bub\d+ m)[\s\S])+') ){
  32.     $key = $m.Groups[1].Value;  #数字序号
  33.     $value = $m.Groups[0].Value.Trim("`r`n");
  34.     if( !$hash.Contains($key) ){
  35.         $hash.Add( $key, $value );
  36.     }
  37. }
  38. for( $i = 0; $i -lt $count; $i++ ){
  39.     $m = $arr[$i] -match '^([^:]+):bub\.Bub(\d+)';
  40.     if( $m ){
  41.         $arr[$i] = [regex]::Replace($arr[$i], '(?i)(?<=bub\.Bub)\d+',{return (++$global:n)});
  42.         $key = $matches[2];    #数字序号
  43.         if( $hash.Contains($key) ){
  44.             $str = $hash[$key] -replace '(?<=^#bub Bub)\d+ m.*(?=\r?\n)', ('' + $global:n + ' m ;;' + $matches[1]);
  45.         }else{
  46.             $str = '#bub Bub' + $global:n + ' m ;;' + $matches[1] + "`r`n我是新来的";
  47.         }
  48.         [void]$arr.Add( "`r`n" + $str );
  49.     }
  50. }
  51. $arr
复制代码

TOP

回复 3# meixi


    这个样本与顶楼的样本有什么区别,你自己做比较没?
这个样本中 bub.bub 与 #bub bub 是小写,而顶楼给的样本包含大写。
顶楼给出的样本必须具有代表性,改来改去谁都会烦。

TOP

回复 3# meixi


    已修改

TOP

本帖最后由 WHY 于 2022-12-3 11:38 编辑

回复 7# 5i365


    确实,第53行这样改:
  1. $str = $hash[$key] -replace '(?<=^#bub Bub)\d+ m[^\r\n]*', ('' + $global:n + ' m ;;' + $matches[1]);
复制代码
-replace替换运算符中,"."默认可以匹配到\r

TOP

回复 10# 5i365


    你要是对正则感兴趣,建议你多看看MS官方文档。
https://learn.microsoft.com/zh-c ... regular-expressions
网上关于正则的教程良莠不齐,有的甚至是错误的。

多行模式:修改 ^ 和 $ 的行为,^可以匹配每行的开头,$可以匹配\n(不能匹配\r\n)
单行模式:修改 . 的行为(默认情况下,"."匹配除\n以外的任意字符),可以匹配任意字符,等同于[\s\S]

TOP

11楼的链接你打开过没有?答案就在里面。
https://learn.microsoft.com/zh-c ... ons#default-options

TOP

返回列表