2010-07-20 80 views
2

我有这个字符串: -正则表达式:替换字符串中的字符的第一次发生

ABCDE /东西的东西:XYZ = 0,JKLM = 0/SOMETHING东西:SOME_VALUE

什么是正则表达式这样只有第一个冒号(:)被替换为下划线(_)?

+2

你使用Perl,.NET,Python或你的壳呢? – 2010-07-20 04:00:21

+0

除非您在正则表达式中设置全局标志,否则绝大多数正则表达式仅替换第一个匹配项。 – Amarghosh 2010-07-20 04:20:28

+0

@Amarghosh:你还必须考虑用于应用正则表达式的方法。例如,在Java中使用'replaceAll()'和'replaceFirst()'。 – 2010-07-20 05:16:06

回答

1

在标准的系统,只要简单的写:

s/:/_/ 

为了实现全局替换(以下划线代替冒号的每一个实例),你会替换后加一个限定词(经常“G”)。

不同的语言对正则表达式使用不同的符号,所以详细的答案取决于目标语言。然而,我写的是'sed','ed','vi','vim'和Perl。

1

只匹配两组 - 第一个是第一个冒号前的所有内容;第二,它后面的一切。然后只需重建带有下划线的字符串。

 
s/([^:]*):(.*)/\1_\2/ 

根据您使用的语言/正则表达式引擎,您将需要不同的转义。

1

你可以做到这一点在使用负回顾后发正则表达式,但这是相对低效:

(?<!:.*): 

,如果没有其他的结肠已被先前匹配将只匹配一个冒号。

但是,由于您只替换一个字符,而不是字符模式,因此我建议使用该语言的原生“替换”功能。你会得到更好的性能和可读性。

+1

这可能适用于.NET或JGSoft风格,但大多数风格都需要lookbehind表达式来匹配具有已知固定长度的子字符串。无论如何,向后看不应该是你的第一个度假胜地;几乎总是有更好的方法。 – 2010-07-20 05:07:34

+0

嗯,很高兴知道,谢谢。 – Josiah 2010-07-20 18:48:32

0

,如果你是在* nix和有像sed

$ echo "ABCDE/Something something:XYZ=0, JKLM=0/SOMETHING Something:some_value" | sed 's/:/_/' 
ABCDE/Something something_XYZ=0, JKLM=0/SOMETHING Something:some_value 

工具还,如果你使用bash作为

$ var="ABCDE/Something something:XYZ=0, JKLM=0/SOMETHING Something:some_value" 
$ echo ${var/:/_} 
ABCDE/Something something_XYZ=0, JKLM=0/SOMETHING Something:some_value