仅匹配正则表达式行中的第一个匹配项


42

我是regex的新手,我将不胜感激。

任务很简单。我有一个CSV文件,其记录显示如下:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

我想用空格替换第一个逗号,并保留每行的其余逗号。是否存在仅与第一个逗号匹配的正则表达式?

我尝试了这个:^.....,。这与逗号匹配,但是,它也与逗号前面的字符串的整个长度匹配,因此,如果我尝试将其替换为空格,则所有数字也会被删除。


您正在使用什么工具?(SED,Perl中,awk的,别的东西吗?)

Answers:


53

匹配模式可以是:

^([^,]+),

那意味着

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

在例如perl中,整个匹配和替换看起来像:

s/^([^,]+),/\1 /

替换部分仅将匹配的整个内容替换为您记住的第一个块,并添加一个空格。昏迷被“丢弃”,因为它不在第一个捕获组中。


太棒了!谢谢Mat,效果很好。它实际上在Textpad中不起作用(我认为他们的正则表达式是有限的),所以我最终下载了PowerGrep,并使用搜索和替换为您提供的表达式,效果很好。也感谢您的出色解释,它有助于了解发生了什么。
cows_eat_hay

7
s/,/ /

默认情况下(即没有g选项),它将仅替换第一个匹配项。


1
这实际上是Textpad搜索和替换语法吗?
丹尼尔·贝克

1
这是一个语法sedperl以及一些其他的工具。
pabouk

3

该名称只能与第一个数字和逗号匹配:^(\d{5}),。如果您想吞噬该行中的所有其他内容,请将正则表达式更改为:^(\d{5}),(.*)$


这也起到了作用。实际上,我最终使用了Mat的解决方案,但我也测试了您的解决方案,并且效果很好。谢谢您的帮助!
cows_eat_hay

为什么\d{5}[^,]*呢?那至少会更通用。
JustinCB

2

更优雅的解决方案是使用惰性匹配:

s/^(.+?),/\1 /

它将通过在每个步骤中从字符串(^)的开始向结尾移动一个字符(.+?)来对字符进行分组,直到找到第一个逗号为止。所有这些组以及第一个逗号都将被组(\1)和空格字符代替。


请注意,这将与不包含逗号(一行中的单个值)的行不匹配。匹配任何* 可能好于一个+如此s/^(.*?),/\1 /
杰夫·帕克特

您也可以这样做s/^([^,]*),/\1 /,它将与开始匹配,而不是逗号,然后是逗号。另外,您s//是否不知道不会更改不匹配的内容?
JustinCB

1

TextPad始终可以使用posix表示法,但是您必须在其他对话框中更改设置。要将TextPad的默认设置用于正则表达式,必须“转义”左括号和右括号:

每行开头的5位数邮政编码后的空格

^\([0-9]+\)[ ]

带标签

\1\t

如上所述,^表示行的开始

\(是“转义括号”,它标记第一个搜索表达式的开始,即五位数字

[0-9] +表示一个或多个数字(不仅是5位数的邮政编码)

\)是另一个“转义括号”,用于标记第一个搜索表达式的结尾

[]只是一个空格字符(您可以省略方括号,但是没有人可以在此网页上看到它:-)

在替换表达式中

\ 1是第一个搜索表达式,位于圆括号之间的部分(一个或多个数字)

\ t是制表符

因此,搜索和替换命令将查找一个或多个数字,后跟一个空格。然后,将所有内容替换为同一组数字,后跟一个制表符。

我认为没有任何方法可以简单地找到“ 5位数字之后的空格”,因此您可以替换空格而不用触摸数字。您必须找到 5位数字(第一个字符串),然后是空格(第二个字符串)。然后,尽管看起来多余或麻烦,但用ITSELF替换5位数字的原始字符串,然后使用制表符(第二个字符串)。

知道这一点的每个人都忘记了新手对此一无所知。这就是为什么我要为你,我的朋友拼写出来。

Ed Poor Math家教和退休的计算机程序员纽约


0

若要仅匹配任何正则表达式的第一个匹配项,请删除所有标志。每个regex表达式都带有以下可能的标志,通常默认情况下使用全局标志,该标志将匹配多个事件:

  • / g =使用此标志,搜索将查找所有匹配项,如果没有它,则仅返回第一个匹配项
  • / i =不区分大小写
  • / m =多行模式
  • / s =全部。匹配换行符\ n
  • / u = Unicode
  • / y =粘性模式(在特定位置搜索)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.