我的值是这样的:

"Foo Bar" "Another Value" something else

什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?


当前回答

我认为:

"([^"]*)"

[^"]是除'"'以外的任何字符的正则表达式 我用这个代替非贪婪多算子的原因是我需要不断地查找以确保我得到的是正确的。

其他回答

这个版本

转义引号的说明 控制回溯 /(["'])((?:(?!\ 1 )[^\\]|(?:\\\\)*\\[^\\])*)\ 1 /

我一直在使用以下方法并取得了巨大的成功:

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

它还支持嵌套引号。

对于那些想要更深入地解释这是如何工作的人,这里是用户ephemerent的解释:

([""'])匹配引号;((?=(\\?))\2.)如果存在反斜杠,吞噬它,无论是否发生,匹配一个字符;* ?匹配多次(非贪婪,如不吃结尾引号);\1匹配相同的报价,是用于开幕。

我的解决方案如下

(\[‘])。* 1 (? ! [s ^ \])

演示链接:https://regex101.com/r/jlhQhV/1

解释:

(["'])->匹配'或',一旦找到匹配,将其存储在反向引用\1中

.* ->贪婪的方法继续匹配所有内容0次或更多次,直到它在字符串末尾遇到'或"。遇到这种状态后,正则表达式引擎返回到上一个匹配字符,此时正则表达式结束,将移动到下一个正则表达式。

\1 ->匹配先前与第一个捕获组匹配的字符或字符串。

(?![^\s]) ->负前向,确保在之前的匹配之后不应该有任何非空格字符

我喜欢Eugen Mihailescu的解决方案,在允许转义引号的同时匹配引号之间的内容。然而,我发现了一些转义的问题,并提出了以下正则表达式来解决它们:

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

它做到了这一点,而且仍然非常简单,易于维护。

演示(包含更多的测试用例;请随意使用并扩展它)。


PS:如果你只是想在引号之间的内容完全匹配($0),并不怕性能惩罚使用:

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

不幸的是,没有引号作为锚,我不得不添加一个边界\b,它不能很好地处理开始引号后的空格和非单词边界字符。

或者,修改初始版本,只需添加一个组,并从$2中提取字符串:

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

PPS:如果你只关注效率,那就选择Casimir和Hippolyte的解决方案;这是一个很好的例子。

对于Microsoft VBA编码器子集的补充回答,只有一个人使用Microsoft VBScript正则表达式5.5库,这给出了以下代码

Sub TestRegularExpression()

    Dim oRE As VBScript_RegExp_55.RegExp    '* Tools->References: Microsoft VBScript Regular Expressions 5.5
    Set oRE = New VBScript_RegExp_55.RegExp

    oRE.Pattern = """([^""]*)"""


    oRE.Global = True

    Dim sTest As String
    sTest = """Foo Bar"" ""Another Value"" something else"

    Debug.Assert oRE.test(sTest)

    Dim oMatchCol As VBScript_RegExp_55.MatchCollection
    Set oMatchCol = oRE.Execute(sTest)
    Debug.Assert oMatchCol.Count = 2

    Dim oMatch As Match
    For Each oMatch In oMatchCol
        Debug.Print oMatch.SubMatches(0)

    Next oMatch

End Sub