2013-10-25 91 views
2

我有一个正则表达式引号之间找到之间的值:正则表达式查找报价

([\"'])(?:\\\1|.)*?\1 

如果有报价之间的双引号然而,这工作得很好,的话,就无法和其拆分太。例如。

"value1","value2","value with "" is here","value4" 

我需要一个像

value1 
value2 
value with "" is here 
value4 

输出也就是说,如果双引号出现的地方,它应该返回的输出。 任何人都可以帮忙吗?

回答

2

我的第一个想法是将它们添加到您的交替,让双引号:

([\"'])(?:\\\1|\1\1|.)*?\1 

然而,由于你做出量词懒,这将仍然不太工作。最好让它明确的是转义引号不引号之间允许:

([\"'])(?:\\\1|\1\1|(?!\1).)*\1 

看到它的regex101

说明:

([\"']) # Match a quote, remember which kind in group 1. 
(?:  # Start non-capturing group: 
\\\1  # Either match a backslash-escaped quote 
|   # or 
\1\1  # a doubled quote 
|   # or 
(?!\1) # (as long as it's not a quote) 
.  # any character. 
)*  # Repeat as necessary 
\1  # Match a corresponding quote 
+0

是的,它是CSV文件的一部分。是的,你提供的表达式是'([\''])(?:\\\ 1 | \ 1 \ 1 |(!!\ 1)。)* \ 1',但是另一个表达式不会。 –

1

您的输入看起来像一个CSV记录,其中文字报价是通过增加另一个报价逃脱。你是说你也可以用反斜杠来避免引用?我从未见过;它通常是一个或另一个。我从来没有见过CSV变体,它可以让你在同一记录中的单引号(撇号)或双引号之间进行切换。你可能会让它变得更加复杂。

假设只有双引号是公认的字段分隔符,并且他们只能通过增加另一个报价进行转义,匹配字段很简单,只要可以是:

(?:"[^"]*")+ 

的反斜杠转义版本更复杂一点:

"[^"\\]*(?:\\.[^"\\]*)*" 

如果单引号分隔符也是允许的,最简单的方法是添加另一种选择:

(?:"[^"]*")+|(?:'[^']*')+ 

"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*' 

如果你真的需要支持这两种引用和两种逃避,请参阅蒂姆的答案。但我非常怀疑。

+0

是的,它是CSV文件的一部分。是的,你提供的表达式有效(?:“[^”] *“)+ |(?:'[^'] *')+您和@ time-pietzcker都提供了正确的解决方案。我不知道如何将两个答案都标记为“答案”。似乎我只能标记一个。 –