正则表达式以查找引号之间的值

时间:2013-10-25 08:20:01

标签: regex vb.net

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

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

这样可以正常工作,但是,如果引号之间有双引号,则它会失败并将它们拆分。例如。

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

我需要输出

value1
value2
value with "" is here
value4

这意味着,如果双引号出现在某个地方,它应该在输出中返回。 任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您的输入看起来像CSV记录,其中通过添加另一个引号来转义字面引用。你是说你还可以用反斜杠来逃避引用?我从未见过;它通常是一个或另一个。而且我从来没有见过一种CSV变体,它允许您在同一记录中的单引号(撇号)或双引号之间切换。你可能会把它变得比它需要的更复杂。

假设只有双引号被识别为字段分隔符,并且只能通过添加另一个引号来转义它们,匹配字段就像这样简单:

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

反斜杠转义版本稍微复杂一些:

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

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

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

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

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