正则表达式:仅匹配每行第一次出现

时间:2018-01-26 16:22:49

标签: regex

我想选择第一个" - "从每一行:

123 - foo - asdf
234 - bar - abcdefg
345 - foobar and hello world

如果您使用\s-\s,它将从前两行中选择两个匹配项。

所以我想要的是:

enter image description here

我想要一个空格,然后是一个连字符,然后是另一个空格\s-\s,而不仅仅是连字符,并将其替换为test,这是第一行:123testfoo - asdf

我认为你必须添加一个?才能让它变得非贪婪,但我不知道如何。

感谢。

修改:这是目标

我有一个巨大的ID和文本文件,我想创建一个MySQL INSERT语句。所以我想用\s-\s(在那部分中)替换第一个, '事件。

3 个答案:

答案 0 :(得分:2)

要匹配每一行的第一个匹配项,需要将模式锚定到行的开头。

See regex in use here

^([^-]*?)\s*-\s*
  • ^在行首处断言位置
  • ([^-]*?)任意次数捕获除-以外的任何字符,但尽可能少地捕获到捕获组1
  • \s*-\s*匹配任意数量的空白字符,后跟连字符-字符,后跟任意数量的空白字符

替换:$1, '

令牌$1是对第一个捕获组最近捕获的文本的引用。

答案 1 :(得分:0)

如果您发现自己遇到类似的问题,但无法使用已接受的答案解决此问题,请尝试以下操作:

我正在尝试删除第一个

','

从sql导出的数据文件中,以便将人员姓名与其姓氏(数据示例)合并: ,

('MARTIN','MULLER QUEIJO',46574180,'1996-06-12','Dirección no definida','Dirección no definida','',3)
,('ALFREDO','ACOSTA',342,'23423','asdas','asdasd','',3)
,('JULIO','RODRIGUEZ',3223424202569,'42423','23fs','asdas','',3)
,('EVELIS (43)','MAIDANA CASCO',2342,'asdas','dfgdfg','3ggfd','',3)

为此,我最终使用了此正则表达式:

(',')(?=.*(',').*(',').*(','))

如您所见,我得到了我想要的标记(',')的第一次出现,并丢弃了相同的标记,正如您预计它会出现在每一行中一样。因此,只有当您已经知道该令牌出现在行中的次数以及每次行的次数相同(在这种情况下为4次,因此我将其删除了3次)时,这才可能起作用。 >

答案 2 :(得分:-1)

使用负向lookbehind确保匹配前行中不再有连字符:

(?<![-].*)(\s[-]\s)