我有这个字符串: -正则表达式:替换字符串中的字符的第一次发生
ABCDE /东西的东西:XYZ = 0,JKLM = 0/SOMETHING东西:SOME_VALUE
什么是正则表达式这样只有第一个冒号(:)被替换为下划线(_)?
我有这个字符串: -正则表达式:替换字符串中的字符的第一次发生
ABCDE /东西的东西:XYZ = 0,JKLM = 0/SOMETHING东西:SOME_VALUE
什么是正则表达式这样只有第一个冒号(:)被替换为下划线(_)?
在标准的系统,只要简单的写:
s/:/_/
为了实现全局替换(以下划线代替冒号的每一个实例),你会替换后加一个限定词(经常“G”)。
不同的语言对正则表达式使用不同的符号,所以详细的答案取决于目标语言。然而,我写的是'sed','ed','vi','vim'和Perl。
只匹配两组 - 第一个是第一个冒号前的所有内容;第二,它后面的一切。然后只需重建带有下划线的字符串。
s/([^:]*):(.*)/\1_\2/
根据您使用的语言/正则表达式引擎,您将需要不同的转义。
你可以做到这一点在使用负回顾后发正则表达式,但这是相对低效:
(?<!:.*):
,如果没有其他的结肠已被先前匹配将只匹配一个冒号。
但是,由于您只替换一个字符,而不是字符模式,因此我建议使用该语言的原生“替换”功能。你会得到更好的性能和可读性。
这可能适用于.NET或JGSoft风格,但大多数风格都需要lookbehind表达式来匹配具有已知固定长度的子字符串。无论如何,向后看不应该是你的第一个度假胜地;几乎总是有更好的方法。 – 2010-07-20 05:07:34
嗯,很高兴知道,谢谢。 – Josiah 2010-07-20 18:48:32
,如果你是在* 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
你使用Perl,.NET,Python或你的壳呢? – 2010-07-20 04:00:21
除非您在正则表达式中设置全局标志,否则绝大多数正则表达式仅替换第一个匹配项。 – Amarghosh 2010-07-20 04:20:28
@Amarghosh:你还必须考虑用于应用正则表达式的方法。例如,在Java中使用'replaceAll()'和'replaceFirst()'。 – 2010-07-20 05:16:06