【问题标题】:Regex batch: insert space between letters and numbers正则表达式批处理:在字母和数字之间插入空格
【发布时间】:2021-04-04 05:25:57
【问题描述】:

我有这样的文件名

Chi10febbraio2021
ChiK11Marzo2021

我用这个脚本(你可以找到jrepl.bat here

for %%a in (*) do ( 
  for /f "tokens=*" %%b in ('echo %%a^|jrepl.bat "([A-Z])" " $1"') do (
     ren "%%a" "%%b"
  )
)

这样在大写字母和小写字母之间插入一个空格

Chi10febbraio2021
Chi K11Marzo2021

我尝试用这种方式在字母和数字之间添加一个空格

 Chi 10 febbraio 2021
 Chi K 11 Marzo 2021

"([A-Z])" " $1"') 更改为([a-z])([0-9])" "$1 $2"')

但它返回我

Chi 10Febbraio 2021

当我期待时

Chi 10 Febbraio 2021

【问题讨论】:

  • 您知道JREPL 的开发者会定期在 DosTips.com 和此处回答问题。

标签: regex batch-file


【解决方案1】:

([A-Z]) 替换为" $1" 不会“在大小写字母之间插入空格”,它会在任何大写字母之前插入一个空格,这是完全不同的事情。 p>

您不能“扩展”此表达式以在字母和数字之间也插入空格,因为在字符类型之间插入空格并不是它最初所做的。您的输入只是意外地以“在每个大写字母之前插入一个空格”的方式形成了正确的事情。

我没有研究过jrepl.bat 的实现,但是你链接的页面说它是一个 JScript/batch 混合,这让我假设它在内部使用了 Windows Script Host 的正则表达式引擎.

如果是这样,这个正则表达式应该可以工作。

([a-zA-Z])(?=[0-9])|([a-z])(?=[A-Z])|([0-9])(?=[A-Za-z])

替换为"$1$2$3 "。当您按原样将其粘贴到批处理文件中时,您可能会遇到语法错误,我会让您自己弄清楚转义。

正则表达式的工作原理是涵盖可能发生的三种情况:

  1. 一个字母后跟一个数字 - ([a-zA-Z])(?=[0-9])
  2. 一个小写字母后跟一个大写字母 - ([a-z])(?=[A-Z])
  3. 一个数字后跟一个字母 - ([0-9])(?=[A-Za-z])

在所有三种情况下,我们都需要附加一个空格。这些案例是互斥的——当一个案例匹配时,其他两个不匹配。这意味着我们可以在替换字符串中背靠背使用所有三个组$1$2$3,其中只有一个包含任何内容,我们不在乎它是哪一个。这就是"$1$2$3 " 的工作原理。

【讨论】:

  • 太棒了!谢谢,现在我明白是什么问题了
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2012-09-12
  • 1970-01-01
相关资源
最近更新 更多