正则表达式只匹配第一个字符

4

基本上,我有以下这些行:

line1:blabla:etcetc
line2:blabla2:etcetc2
line3:blabla3:etcetc3

我需要捕获第一个 “ : ” 符号。这是我现在的正则表达式,但它会捕获所有的 “ : ” 符号。

[(:*?)]

[(:*?)] 我需要仅捕获第一个“:”,可以使用以下正则表达式:

[:]


你要怎么处理第一个 : - Wiktor Stribiżew
我需要用 \t 替换它。 - Catalin
你使用哪种语言/工具?每一行是单独的字符串还是都包含在一个字符串中? - Sebastian Proske
1个回答

4
请注意,[(:*?)] 正则表达式匹配一个符号,它可以是 (:*?) 中的任意一个,因为外部括号形成了一个字符类(或 POSIX 正则表达式中的括号表达式),您可以在其中定义该构造可以匹配的字符或范围,但它将匹配属于集合/范围的 1 个字符。
第一个 : 可以匹配。
^([^:]*):

并替换为 $1\t

参见正则表达式演示

详细信息:

  • ^ - 字符串的开头
  • ([^:]*) - 第1组捕获除:以外的0个或多个字符,使用反向字符类[^:](注意我们捕获需要保留的内容)
  • : - 一个字面意义上的:(注意我们匹配需要替换的内容)

替换模式中的$1是指第1组捕获的值。


非常感谢您的回答! - Catalin
请注意,根据工具/语言/方法的不同,可能需要 ^([^:]*):(.*) -> $1\t$2。或者甚至需要使用 (?m) 修改器,如果每一行都必须被处理(例如 (?m)^([^:\n]*):(.*))。 - Wiktor Stribiżew
谢谢提供的信息!$1\t 运行得很好。我正在使用 emeditor 进行此操作。 - Catalin
我刚刚添加了一个解释,说明你的正则表达式匹配什么。基本上,它将匹配集合中的第一个字符,如果启用全局匹配,则会匹配所有字符。 - Wiktor Stribiżew
如果有人像我一样需要匹配第一个而不是在split之前的内容,这个方法不允许你替换,那么在Java中可以使用str.split(":", 2)来解决。这将给你两个字符串:第一个:之前的内容和其余所有的: - LogicalKip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接