vim中的非贪婪匹配

时间:2014-12-12 17:23:04

标签: regex vim regex-greedy

我已经在Stack Overflow中看到了一些关于它的问题,但仍然无法解决我的问题。我几乎在那里,但需要一些帮助。 我试图找到的模式是:

/SELECT.*\ncoalesce.*\(\n.*\)*) x

这意味着: SELECT,任何东西,换行符,合并,任何东西,(换行符,任何东西)*,)x

问题是,模式'(换行,什么)'应该发生0次或更多次,但是尽可能少,所以我尝试用{ - }替换*,将搜索转换为

/SELECT.*\ncoalesce.*\(\n.*\)\{-}) x

但它没有用。它根据需要不断选择一个大块而不是几个块。如果我使用数字而不是 - (例如{10})它适用于10行或更少行的块,但由于此数字可能会有所不同,我无法做到这一点。 有没有人有办法解决吗? 以下是我使用的文件示例:

INSERT INTO lattes.palavras_chave (palavra_chave_1,palavra_chave_2,palavra_chave_3,palavra_chave_4,palavra_chave_5,palavra_chave_6)
SELECT palavra_chave_1,palavra_chave_2,palavra_chave_3,palavra_chave_4,palavra_chave_5,palavra_chave_6 from (
SELECT
coalesce(T2.Loc.value('@PALAVRA-CHAVE-1','varchar(max)'),'') as palavra_chave_1 ,
coalesce(T2.Loc.value('@PALAVRA-CHAVE-2','varchar(max)'),'') as palavra_chave_2 ,
coalesce(T2.Loc.value('@PALAVRA-CHAVE-3','varchar(max)'),'') as palavra_chave_3 ,
coalesce(T2.Loc.value('@PALAVRA-CHAVE-4','varchar(max)'),'') as palavra_chave_4 ,
coalesce(T2.Loc.value('@PALAVRA-CHAVE-5','varchar(max)'),'') as palavra_chave_5 ,
coalesce(T2.Loc.value('@PALAVRA-CHAVE-6','varchar(max)'),'') as palavra_chave_6
,tx.data_modificacao as data_modificacao_xml
FROM lattes.curriculos_xml tx
CROSS APPLY arquivo.nodes('//PALAVRAS-CHAVE') as T2(Loc)
) x
group by 
palavra_chave_1,
palavra_chave_2,
palavra_chave_3,
palavra_chave_4,
palavra_chave_5,
palavra_chave_6;

INSERT INTO lattes.area_do_conhecimento_1 (nome_grande_area_do_conhecimento,nome_da_area_do_conhecimento,nome_da_sub_area_do_conhecimento,nome_da_especialidade)
SELECT nome_grande_area_do_conhecimento,nome_da_area_do_conhecimento,nome_da_sub_area_do_conhecimento,nome_da_especialidade from (
SELECT
coalesce(T2.Loc.value('@NOME-GRANDE-AREA-DO-CONHECIMENTO','varchar(max)'),'') as nome_grande_area_do_conhecimento ,
coalesce(T2.Loc.value('@NOME-DA-AREA-DO-CONHECIMENTO','varchar(max)'),'') as nome_da_area_do_conhecimento ,
coalesce(T2.Loc.value('@NOME-DA-SUB-AREA-DO-CONHECIMENTO','varchar(max)'),'') as nome_da_sub_area_do_conhecimento ,
coalesce(T2.Loc.value('@NOME-DA-ESPECIALIDADE','varchar(max)'),'') as nome_da_especialidade
,tx.data_modificacao as data_modificacao_xml
FROM lattes.curriculos_xml tx
CROSS APPLY arquivo.nodes('//AREA-DO-CONHECIMENTO-1') as T2(Loc)
) x
group by 
nome_grande_area_do_conhecimento,
nome_da_area_do_conhecimento,
nome_da_sub_area_do_conhecimento,
nome_da_especialidade;

谢谢。

2 个答案:

答案 0 :(得分:2)

请注意,即使使用\{-\},您的群组中仍然会有贪婪的.*

尝试select.*\ncoalesce\_.\{-\}\n) x

答案 1 :(得分:2)

问题在于您\n.*.*在您的捕获组内贪婪。你可以通过切换到最后匹配你的\n而不是这样来解决这个问题:

/SELECT.*\ncoalesce.*\n\(.*\n\)\{-}) x

或使用两个\{-}

/SELECT.*\ncoalesce.*\(\n.\{-}\)\{-}) x

或者通过将其替换为\_.(我的推荐)来简化您的捕获组:

/SELECT.*\ncoalesce\_.\{-}) x

如需更多帮助,请参阅:

:h /\_.
:h /\{-