我想选择第一个" - "从每一行:
123 - foo - asdf
234 - bar - abcdefg
345 - foobar and hello world
如果您使用\s-\s
,它将从前两行中选择两个匹配项。
所以我想要的是:
我想要一个空格,然后是一个连字符,然后是另一个空格\s-\s
,而不仅仅是连字符,并将其替换为test
,这是第一行:123testfoo - asdf
。
我认为你必须添加一个?
才能让它变得非贪婪,但我不知道如何。
感谢。
修改:这是目标:
我有一个巨大的ID和文本文件,我想创建一个MySQL INSERT语句。所以我想用\s-\s
(在那部分中)替换第一个, '
事件。
答案 0 :(得分:2)
要匹配每一行的第一个匹配项,需要将模式锚定到行的开头。
^([^-]*?)\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)