替换字符串中最后出现的字符

时间:2014-07-04 15:43:20

标签: regex string powershell replace special-characters

我有以下字符串:

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”的长度从一行到另一行不等,斜线字符可能在任何地方。

谢谢:)

5 个答案:

答案 0 :(得分:10)

使用以下字符串匹配:

(.*)[/](.*)

以及以下内容替换:

$1 $2

说明:

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

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

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

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

答案 1 :(得分:2)

你也可以使用lookahead:

'01/01/2014 blbalbalbalba blabla/blabla' -replace '/(?=[^/]+$)',' '

01/01/2014 blbalbalbalba blabla blabla

'/(?= [^ /] + $)'将匹配紧接在EOL之前的一系列'not /'字符之前的'/'字符,但这可能不如直接匹配效率低。

答案 2 :(得分:0)

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

答案 3 :(得分: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, ' ')

答案 4 :(得分:-1)

$是行尾的锚点。 所以 (。*?)([A-Z])$

应该匹配你想要的东西,而()中的东西就是你要替换的东西。

祝你好运