Powershell正则表达式只取代了第一击

时间:2014-09-10 16:15:21

标签: regex powershell

我尝试使用正则表达式在单击之后替换第一个字符,同时使用PowerShell。

无论我如何尝试,我似乎无法使其发挥作用。这就是我所说的:

代码:

$info = 'AB/F/*ZXCVBN/MTF/ ---'

$regex = [REGEX]'/*'
$regex.Replace($info,"/C",1)

$regex

输出:

/CAB/F/*ZXCVBN/MTF/ ---

我只是尝试用/F替换表达式中的/C,但每次都失败。

我使用/*,因为我不知道在第一个/之后我会找到什么字符,但我最终要替换的是什么当天。

我很确定这会非常简单但是,正如你所看到的,我对正则表达式不够熟悉。

5 个答案:

答案 0 :(得分:1)

好的,我想我会添加一个答案,而不仅仅是评论。您可以使用负向lookbehind来确保在匹配之前没有/,因此它只匹配第一个。另外,正如Noah所说, * 不是通配符,是。这将匹配字符串中没有其他/任何位置的任何/加1字符:

"(?<!/.*)/."

因此,在代码的上下文中,它看起来像这样:

$info = 'AB/F/*ZXCVBN/MTF/ ---'
$regex = [REGEX]"(?<!/)/."
$regex.Replace($info,"/C",1)

这些行将输出:

AB/C/*ZXCVBN/MTF/ ---

修改:RegEx101的RegEx细分:http://regex101.com/r/tI7oN1/1

答案 1 :(得分:0)

你在正则表达式中误解了*。它不是通配符。

正则表达式中的星号表示捕获表达式中前面的0个或多个项目。 正则表达式中的通配符实际上是一个时期。

答案 2 :(得分:0)

$info = 'AB/F/*ZXCVBN/MTF/ ---' 
$regex = [REGEX]'/.'
 $regex.Replace($info,"/C",1)

或者简单地说:

$info -replace '^(.*?)/.','$1/C'

答案 3 :(得分:0)

$info = 'AB/F/*ZXCVBN/MTF/ ---'
$regex = [REGEX]'^([^/]*)/[a-zA-Z]'
$regex.Replace($info,"$1/C",1)
$regex

^([^/]*) - 这会在开头搜索除了斜线之外的任何内容,在组中捕获

/[a-zA-Z] - 然后斜线后跟一个字母

替换会放回第一组匹配的内容,并添加/C

答案 4 :(得分:0)

如果您不想使用正则表达式,可以使用-split和-join完成相同的操作:

$info = 'AB/F/*ZXCVBN/MTF/ ---'
$info -split '/.',2 -join '/C'

AB/C/*ZXCVBN/MTF/ ---

,2将在第一场比赛后停止分裂(2个元素)。然后用/ C重新加入元素。