替换字符串中最后一个字符的出现位置

6
我有以下字符串:

01/01/2014 blbalbalbalba blabla/blabla

我想用空格替换最后一个斜杠,并保留日期中的前两个斜杠。
我尝试了以下方法:
PS E:\> [regex] $regex = '[a-z]'
PS E:\> $regex.Replace('abcde', 'X', 3)
XXXde

但我不知道如何从行末开始。非常感谢您的帮助。

编辑我的问题以澄清: 我只想用空格字符替换最后一个斜杠字符,因此:

01/01/2014 blbalbalbalba blabla/blabla 变成了 01/01/2014 blbalbalbalba blabla blabla

知道“blabla”的长度因一行而异,并且斜杠字符可以出现在任何地方。

谢谢:)


我投票支持重新开放,因为OP指定了PowerShell。JavaScript表达式由于$1而失败。这不是重复的问题。 - InteXX
5个回答

10

使用以下字符串进行匹配:

(.*)[/](.*)

并使用以下内容替换:

$1 $2

说明:

(.*) 匹配任何字符,任意次数(包括零)。将其放置在括号中,可以在替换时再次使用,使用占位符 $ 和元素编号(例如,因为这是第一个元素,所以$1 将是占位符)。当我们在替换字符串中使用相关的占位符时,它将把正则表达式此部分匹配到的所有字符放入结果字符串中。在这种情况下,匹配的文本将是 01/01/2014 blbalbalbalba blabla

[ / ] 用于匹配正斜杠字符。

(.*) 再次用于匹配任何字符,任意次数,类似于第一次使用。在这种情况下,它将匹配 blabla,并使其在 $2 占位符中可用。

基本上,前三个元素共同工作,查找一定数量的字符,然后是正斜杠,然后是另一定数量的字符。因为第一个“匹配所有”的表达式是贪婪的(也就是说,它会尝试匹配尽可能多的字符),所以它还将包括所有其他正斜杠,直到最后一个。它停在最后一个正斜杠之前的原因是,如果包括它会使正则表达式失败,因为[/]将无法再匹配任何东西。


绝对精彩! - jpunk11
由于 $1 $2 的原因,此命令在 PowerShell 中失败。 - InteXX

2
您还可以使用前瞻:
'01/01/2014 blbalbalbalba blabla/blabla' -replace '/(?=[^/]+$)',' '

01/01/2014 blbalbalbalba blabla blabla

'

'/(?=[^/]+$)'将匹配在EOL之前紧接着一系列“非/”字符的'/'字符,但这可能比直接匹配不太有效率。

'

这个表达式在PowerShell中成功,而其他表达式则不行。这个表达式不涉及$x占位符,该占位符表示PowerShell变量。 - InteXX

0
'01/01/2014 blbalbalbalba blabla/blabla' -replace '^(\d{2}/\d{2})/(\d{4} .*)','$1 $2'
# outputs this:
# 01/01 2014 blbalbalbalba blabla/blabla

接近了,但是你的示例替换了第二个斜杠,而我需要替换第三个。能否请您解释一下您的正则表达式? :) 非常感谢! - Bluz

0

以下是不使用正则表达式的方法:

$string = "01/01/2014 blbalbalbalba blabla/blabla"
$last_index = $string.LastIndexOf('/')
$chars = $string.ToCharArray()
$chars[$last_index] = ' '
$new_string = $chars -join ''

另一种方法:

$string = "01/01/2014 blbalbalbalba blabla/blabla"
$last_index = $string.LastIndexOf('/')
$new_string = $string.Remove($last_index, 1).Insert($last_index, ' ')

-1

$ 是行末的锚点。 所以 (.*?)([a-z])$

应该匹配你想要的内容,括号中的内容是需要替换的。

最好的问候


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接