Board logo

标题: [问题求助] 【已解决】请教文本处理的方法。最好能用RegExp正则表达式处理 [打印本页]

作者: loveforjg    时间: 2020-11-25 09:49     标题: 【已解决】请教文本处理的方法。最好能用RegExp正则表达式处理

本帖最后由 loveforjg 于 2020-12-8 13:56 编辑

万能的BBS,请教各位高手!
需要将下面带 “[ ]”文本内容找出来,每个方括号的内容输出为一行,并能排序输出。
输入文本:
[
AAA
BBBB
CCCCCC
]

[
D
EE
FFFFF
]

输出格式:
[ BBBB AAA CCCCCC  ]
[ EE D FFFFF]
作者: ivor    时间: 2020-11-25 11:19

[ BBBB AAA CCCCCC ]
[ EE D FFFFF ]
请按任意键继续. . .
  1. #&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit
  2. $str = "
  3. [
  4. AAA
  5. BBBB
  6. CCCCCC
  7. ]
  8. [
  9. D
  10. EE
  11. FFFFF
  12. ]"
  13. [regex]::Matches($str,"\[[\s\S]+?\]") | %{$str_arr=($_.Value -split "\r\n");$str_arr[1],$str_arr[2]=$str_arr[2],$str_arr[1];$str_arr -join " "}
复制代码

作者: flashercs    时间: 2020-11-25 13:35

  1.   Option Explicit
  2.   ' On Error Resume Next
  3.   If WScript.Arguments.Count = 0 Then WScript.Quit 1
  4.   Const conRead    = 1
  5.   Const conWrite   = 2
  6.   Const conAppend  = 8
  7.   Dim fso,sr,str,Match
  8.   Set fso = CreateObject("Scripting.FileSystemObject")
  9.   Set sr = fso.OpenTextFile(WScript.Arguments(0),conRead,False,vbUseDefault)
  10.   Do Until sr.AtEndOfStream
  11.     str = sr.ReadAll
  12.   Loop
  13.   sr.Close
  14.   ' WScript.Echo str
  15.   With New RegExp
  16.     .Global = True
  17.     .Ignorecase = True
  18.     .Multiline = False
  19.     .Pattern = "(\[)[^\r\n]*[\r\n]+([^\r\n]*)[\r\n]+([^\r\n]*)[\r\n]+([^\r\n]*)[\r\n]+.*(\])"
  20.     WScript.Echo .Replace(str,"$1 $3 $2 $4 $5")
  21.   End With
  22. Set sr = Nothing
  23. Set fso = Nothing
复制代码
用法:this.vbs a.txt
作者: loveforjg    时间: 2020-11-25 14:53

回复 3# flashercs

谢谢您的代码,但好像没成功。
能不用拖曳模式吗,输入a.txt, 输出b.txt。目前就是正则表达式“Pattern”这里很疑惑
作者: loveforjg    时间: 2020-11-25 14:54

回复 2# ivor


    看不懂您这个代码,是VBS吗,谢谢您的回复
作者: flashercs    时间: 2020-11-25 15:55

回复 4# loveforjg
  1. Option Explicit
  2. ' On Error Resume Next
  3. Const conRead    = 1
  4. Const conWrite   = 2
  5. Const conAppend  = 8
  6. Dim fso,sr,sw,str,src,dst
  7. src = "a.txt"
  8. dst = "b.txt"
  9. Set fso = CreateObject("Scripting.FileSystemObject")
  10. Set sr = fso.OpenTextFile(src,conRead,False,vbUseDefault)
  11. Do Until sr.AtEndOfStream
  12.   str = sr.ReadAll
  13. Loop
  14. sr.Close
  15. Set sw = fso.OpenTextFile(dst,conWrite,True,vbUseDefault)
  16. With New RegExp
  17.   .Global = True
  18.   .Ignorecase = True
  19.   .Multiline = False
  20.   .Pattern = "(\[)[^\r\n]*[\r\n]+([^\r\n]*)[\r\n]+([^\r\n]*)[\r\n]+([^\r\n]*)[\r\n]+.*(\])"
  21.   sw.Write .Replace(str,"$1 $3 $2 $4 $5")
  22. End With
  23. sw.Close
  24. Set sr = Nothing
  25. Set sw = Nothing
  26. Set fso = Nothing
复制代码

作者: loveforjg    时间: 2020-11-26 10:48

回复 6# flashercs

老大威武!再请教下,如果文本出现多行,只需要替换前两行数据的位置,后面的括号内的数据不论多少行都直接输出,公式咋改呢?
[
A
B
C1
C2
C3
...
]
输出:[B A C1 C2 C3 .......]
作者: flashercs    时间: 2020-11-26 13:13

回复 7# loveforjg
  1. Option Explicit
  2. ' On Error Resume Next
  3. Const conRead    = 1
  4. Const conWrite   = 2
  5. Const conAppend  = 8
  6. Dim fso,sr,sw,str,src,dst,Match,arrLines,strtmp
  7. src = "a.txt"
  8. dst = "b.txt"
  9. Set fso = CreateObject("Scripting.FileSystemObject")
  10. Set sr = fso.OpenTextFile(src,conRead,False,vbUseDefault)
  11. Do Until sr.AtEndOfStream
  12.   str = sr.ReadAll
  13. Loop
  14. sr.Close
  15. Set sw = fso.OpenTextFile(dst,conWrite,True,vbUseDefault)
  16. With New RegExp
  17.   .Global = True
  18.   .Ignorecase = True
  19.   .Multiline = False
  20.   .Pattern = "\[[^\[\]]*\]"
  21.   For Each Match In .Execute(str)
  22.     arrLines = Split(Match,vbNewLine,-1,vbBinaryCompare)
  23.     If UBound(arrLines) > 2 Then ' 含至少2个元素才swap前2个
  24.       strtmp = arrLines(1)
  25.       arrLines(1) = arrLines(2)
  26.       arrLines(2) = strtmp
  27.     End If
  28.     sw.WriteLine Join(arrLines," ")
  29.   Next
  30. End With
  31. sw.Close
  32. Set sr = Nothing
  33. Set sw = Nothing
  34. Set fso = Nothing
复制代码





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