3

我有这个字符串: -

ABCDE/Something something:XYZ=0, JKLM=0/SOMETHINGSomething:some_value

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

4

4 回答 4

1

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

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

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

于 2010-07-20T04:00:21.547 回答
1

您可以在正则表达式中使用否定的lookbehind 执行此操作,但效率相对较低:

(?<!:.*):

如果之前没有匹配过其他冒号,则只会匹配冒号。

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

于 2010-07-20T04:01:02.763 回答
1

在标准系统中,您只需编写:

s/:/_/

要实现全局替换(用下划线替换冒号的每个实例),您需要在替换后添加一个限定符(通常是“g”)。

不同的语言对正则表达式使用不同的符号,因此详细答案取决于目标语言。然而,我所写的内容在 'sed'、'ed'、'vi'、'vim' 和 Perl 中有效。

于 2010-07-20T04:04:56.753 回答
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 作为你的 shell

$ 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
于 2010-07-20T04:31:19.660 回答