我有一个正则表达式来查找引号之间的值:
([\"'])(?:\\\1|.)*?\1
这样可以正常工作,但是,如果引号之间有双引号,则它会失败并将它们拆分。例如。
"value1","value2","value with "" is here","value4"
我需要输出
value1
value2
value with "" is here
value4
这意味着,如果双引号出现在某个地方,它应该在输出中返回。 任何人都可以帮忙吗?
答案 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的回答。但我非常怀疑。