【问题标题】:How to replace all characters except the last digits如何替换除最后一位数字以外的所有字符
【发布时间】:2020-07-30 22:38:25
【问题描述】:

我正在尝试用单个句点替换此语义版本2020.7.28-r5 中的-r,但我得到的是2020.7.28.

这是我到目前为止的想法:

"2020.7.28-r5" -replace "(-[A-Za-z-][0-9A-Za-z-]*)", "."

规范:

  • r 将始终是一个或多个字符(在本例中为 r
  • r 可以是任何 SemVer 合法字符 ([0-9A-Za-z-])
  • r 总是以字符结尾,而不是数字
  • r 前面总是有一个连字符 -
  • 最终数字(当天的内部版本号)将始终为一位或多位数字

基于this answer我尝试了这个表达式:

"(-[A-Za-z-][0-9A-Za-z-]*)(?=\d{4})"

但它并没有取代任何东西。

如何以2020.7.28-The11thFantasticallyCleverUpdateForTheDay11 开头并以2020.7.28.11 结尾?

【问题讨论】:

  • 你能举一些具体的例子吗? r 是一堆数字或字母的占位符吗?那么紧随其后的5 是什么?一些前后的例子会有所帮助。
  • 为什么'everUpdateForTheDay11'没有被删除,因为r can contain any number of numbers and/or characters11是一个数字。
  • r 不是占位符。我在第一个项目符号描述中使用了包含这个词,这让我不清楚。我刚刚修好了。基本上我正在尝试将语义版本号转换为普通版本号。 5 是当天的内部版本号。 (我在我的 CD 管道中使用当前日期/版本作为我的版本号。)
  • 我认为您对占位符 r 的含义一无所知。由于您无法区分 r 停止的位置和最后一位数字的开始位置。您也没有正确定义r 的允许字符集。我不相信你知道。我建议您找到生成此内容的规范并将其用作模板,否则它将失败。
  • 例如 2020.7.28-90523602536934697843811 什么是 r ?根据您的规格,它不清楚。根据您选择的答案,替换为2020.7.28.90523602536934697843811

标签: regex powershell


【解决方案1】:

你可以使用

-replace '-[A-Z][0-9A-Z]*?(\d+)$', '.$1'

请参阅regex demo。请注意 PS 正则表达式默认不区分大小写,[A-Z] 足以匹配所有 ASCII 字母。

详情

  • - - 一个连字符
  • [A-Z] - 任何 ASCII 字母
  • [0-9A-Z]*? - 零个或多个数字或字母
  • (\d+) - 第 1 组($1 指此值):一位或多位数字
  • $ - 字符串结束。

【讨论】:

  • @InteXX 就其本身而言,这里没有任何意义,*? 是一个惰性/非贪婪的量词,表示尽可能少
  • @InteXX 一个变体:$s -replace '-[A-Z][0-9A-Z-]*?(?=\d+$)', '.',参见this regex demo
  • FWIW,我注意到变体也只适用于一个问号:-[A-Za-z][0-9A-Za-z-]*(?=\d+$)。不知道为什么这很重要,但它是双向的。
  • 哦,感谢您指出多余的尾随连字符。我很确定不需要在那里。没有它似乎一切正常。
猜你喜欢
  • 2014-08-21
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多