[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] PowerShell怎样用正则在第1个{后面加1行文本?

大家好, 我想使用正则在第1个{后面加一行文本[123], 【注意 123 是随机3位数字 即:下面$num的值】, 但是这行文本左边的空白字符, 要与其下的行前的空白字符完全相同,
另外, 处理前要先检查一下, { 下有没有 [123] 的行, 有的话, 就不要重复加了, 没有时才加!
下面代码有两个例子, 请路过高手支招, 提前感谢!
  1. $num = "[$(Get-Random -ma 999 -mi 100)]"
  2. $num
  3. #################################################################
  4. $s = @'
  5. zzz
  6. xxx
  7. abc bbb
  8. {
  9. ccc
  10. {
  11. ddd
  12. }
  13. }
  14. '@
  15. <# 正则处理后的结果:
  16. zzz
  17. xxx
  18. abc bbb
  19. {
  20. [123]
  21. ccc
  22. {
  23. ddd
  24. }
  25. }
  26. #>
  27. #################################################################
  28. $s2 = @'
  29. zzz
  30. xxx
  31. abc kkk{
  32. ooo
  33. {
  34. ddd
  35. }
  36. }
  37. '@
  38. <# 正则处理后的结果:
  39. zzz
  40. xxx
  41. abc kkk{
  42. [888]
  43. ooo
  44. {
  45. ddd
  46. }
  47. }
  48. #>
复制代码

powershell确实好使, 但是执行效率, 真是不敢恭维

TOP

回复 24# WHY


    多谢大佬指导
我用最新的PCRE2版的DLL
用您的正则, 仍然会提示无效的替换值
PCRE2 Error Message: invalid replacement string
也就是说    $&[123]$1   字符串识别不了
C#的正则引擎, 确实独特, PHP7.3之后也是内置的PCRE2引擎

TOP

回复 22# meixi


    有些软件就是这样的,这也想支持一下、那也想支持一下,万金油似的,有人认为挺好。
我倒是觉得,杂而不精,无异于什么都不支持,说它辣鸡并不为过。

不用找了,根本没有什么通用的正则!
如果有人告诉你:有!
这个人要么不懂正则,要么就是个江湖骗子。

TOP

回复 20# WHY

这个软件是主角, 它支持ps和C#都是为了增强它自身的功能, 但它本身是有正则模块的, 可能支持没有C#正则全

TOP

本帖最后由 meixi 于 2023-4-10 18:54 编辑

回复 21# WHY


    多谢大佬,
那个垃圾软件肯定要用的,   现在找通用正则就是想让执行的速度快点, 它带的powershell可以直接用代码, 就是执行速度太慢了, 它处理一次要用六秒钟, 而用它自身的正则执行很快, 几乎是瞬间完成的

它也支持C#代码, 比PS快点 , 但还是有编译的过程, 也得要个几秒

TOP

  1. $s = @'
  2. zzz
  3. xxx
  4. abc bbb
  5. {
  6. [123]
  7. {
  8. ddd
  9. }
  10. }
  11. '@
  12. #$num = '[' + (Get-Random -ma 999 -mi 100) + ']';
  13. $num = '[123]';
  14. $arr = $s -split "`r`n";
  15. $s1 = '';
  16. for ($i=0; $i -lt $arr.Count; $i++){
  17.     If ($s1.IndexOf( '{') -ge 0){                 #上一行含"{"字符
  18.         If ($arr[$i].IndexOf($num) -lt 0){        #当前行不含[123]
  19.             $x = $arr[$i].TrimStart();            #删掉开头的空格或跳格
  20.             $y = $arr[$i].Replace($x, '') + $num; #增加一行
  21.             $arr[$i] = $y + "`r`n" + $arr[$i];    #重新赋值
  22.         }
  23.         break;
  24.     }
  25.     $s1 = $arr[$i];
  26. }
  27. $arr
复制代码

TOP

回复 19# meixi


    别的方法就是:
1.扔掉你那个辣鸡软件,用PowerShell就行;
2.不要用正则,用 For 循环 + If 判断

TOP

本帖最后由 meixi 于 2023-4-10 14:51 编辑

回复 11# WHY


  W大, 我把下面正则进行各种修改, 我那软件都稳稳输出只有 { 的一行, 真是怪了, 还有别的方法吗? $0 在那软件是正则的所有匹配 $` 是前面的  $' 是后面的
$s -replace '^[^{]*{(\r?\n[ \t]+)(?!\[123])', '$0[123]$1';

TOP

回复 16# meixi


    网上随便找篇文章,就知道什么是"固化分组"
https://blog.csdn.net/liaowenxiong/article/details/118459839

TOP

回复 14# WHY

3.我感觉你使用的"程序"与PowerShell不搭边,为啥一定要在PowerShell里写正则呢

软件是个英文版的定时任务软件,
它支持powershell, 也支持自己内部的正则, 但是powershell代码执行时反应太慢

TOP

回复 14# WHY
  1. 1.我已经告诉你了,固化分组
复制代码
下面那个链接打不开, 一点就打开编辑器了

TOP

回复 14# WHY


2.我已经给了你一个不用固化分组的、看起来"通用"的脚本,何不试试呢

我已经试了, 上面就是执行后的结果

TOP

回复 13# meixi


1.我已经告诉你了,固化分组
http://www.bathome.net/post.php? ... p;extra=&page=1
2.我已经给了你一个不用固化分组的、看起来"通用"的脚本,何不试试呢
3.我感觉你使用的"程序"与PowerShell不搭边,为啥一定要在PowerShell里写正则呢
4.(?!\[123]) 左括号已经转义,孤零零的右括号不会引起歧义,无需转义。

TOP

本帖最后由 meixi 于 2023-4-10 09:37 编辑

(?>[^{]*)
?后面有个>是什么意思呢, 我的软件只支持下面的,

(?<=)
(?<!)
(?=)
(?!)
___________________________________________________________2

(?!\[123])
上面的!后有\应该是转义吧, 为什么后面那个]不用转义?

TOP

返回列表