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

[文本处理] [已解决]正则表达式替换等号后的字符

本帖最后由 freesoft00 于 2015-4-25 20:53 编辑

示例文本如下:
[HKEY_LOCAL_MACHINE\0-SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Microsoft-Hyper-V-ClientEdition-Package~31bf3856ad364e35~x86~zh-CN~778899.009]
"InstallLocation"="\\\\?\\C:\\temp\\Dism\\IDABMWZB\\50DCE0F9-7402-4AD3-BBEC-1B7D1CB96C07\\"
需要把蓝色的部分替换为-减号。
想用文本编辑器软件的替换功能替换,这个正则式应该如何写呢?
第一个行的Packages\后面的值是不定的。
第二行都是"InstallLocation"开头的,等号后面的不同。

为了说明问题,再加两行示例文本

[HKEY_LOCAL_MACHINE\0-SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Microsoft-Windows-ApisetNamespace-WOW64-Com-Package~31bf3856ad364e35~x86~zh-CN~99.89]
"InstallLocation"="\\\\?\\c:\\temp\\Dism\\IDABMWZB\\50DCE0F9-7402-4AD3-BBEC-1B7D1CB96C07\\"

[HKEY_LOCAL_MACHINE\0-SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Microsoft-Windows-ApisetNamespace-WOW64-Mincore-Package~31bf3856ad364e35~x86~zh-CN~6.77.00]
"InstallLocation"="\\\\?\\c:\\temp\\Dism\\IDABMWZB\\50DCE0F9-7402-4AD3-BBEC-1B7D1CB96C07\\"

TOP

  1. (?<=tion"=").*(?=")
复制代码

TOP

回复 3# bailong360


兄弟,是这样用吗?实验了不行呀。请告知,我不怎么会使用正则。
另外纯批处理可以解决这个问题也可以,省得用软件了。

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('findstr /n .* "测试.txt"')do (
  3. for /f "tokens=1* delims=:" %%b in ("%%a")do (
  4. set "str=%%c"
  5. if "!str:~1,15!" == "InstallLocation" (echo,"InstallLocation"=-) else (echo,%%c)
  6. )))>"结果.txt"
  7. pause
复制代码

TOP

回复 4# freesoft00


可能你这个软件不支持零宽断言吧,我这里是notepad++
顺便楼上已经给出代码了

TOP

回复 5# pcl_test


    多谢,我试试

TOP

回复  freesoft00


可能你这个软件不支持零宽断言吧,我这里是notepad++
顺便楼上已经给出代码了
bailong360 发表于 2015-4-25 19:35

好的,我同意用++这个软件试试

TOP

回复 5# pcl_test


    完美解决,good

TOP

回复 6# bailong360
用++测试了,确实可以。
不过,体会后的结果又点不对。
结果是
"InstallLocation"="-"
等号后面多了两个引号

TOP

我还以为要保留引号
  1. (?<=tion"=)".*"
复制代码

TOP

回复 11# bailong360


    好的,同样完美解决

TOP

回复 11# bailong360


    这个正则是任何等号后面的都可以体会,还是只有我上面的示例文件可以。
我又应用了其它的文档,发现不成功了,没有效果

TOP

回复 13# freesoft00
  1. (?<==).*
复制代码

TOP

回复 14# bailong360


    感谢,可以了。
不过还有点小问题。十六进制显示的注册表键值它的键值不在一行中。替换后只替换了第一行,而没有把后续的内容删除。例如
  1. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\lan\LanguageModel\it]
  2. "Resource1"=hex(2):58,00,3a,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,\
  3.   5c,00,53,00,4b,00,42,00,5c,00,4c,00,61,00,6e,00,67,00,75,00,61,00,67,00,65,\
  4.   00,4d,00,6f,00,64,00,65,00,6c,00,73,00,5c,00,6c,00,6d,00,2e,00,69,00,74,00,\
  5.   2d,00,67,00,72,00,61,00,6d,00,6d,00,61,00,72,00,2e,00,64,00,61,00,74,00,00,\
  6.   00
复制代码
正确的替换应该是
  1. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\lan\LanguageModel\it]
  2. "Resource1"=-
复制代码
而运行正则后的替换结果是
  1. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\lan\LanguageModel\it]
  2. "Resource1"=-
  3.   5c,00,53,00,4b,00,42,00,5c,00,4c,00,61,00,6e,00,67,00,75,00,61,00,67,00,65,\
  4.   00,4d,00,6f,00,64,00,65,00,6c,00,73,00,5c,00,6c,00,6d,00,2e,00,69,00,74,00,\
  5.   2d,00,67,00,72,00,61,00,6d,00,6d,00,61,00,72,00,2e,00,64,00,61,00,74,00,00,\
  6.   00
复制代码
当然这个问题如果不好解决就算了。

TOP

返回列表