我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
当前回答
这个版本
转义引号的说明 控制回溯 /(["'])((?:(?!\ 1 )[^\\]|(?:\\\\)*\\[^\\])*)\ 1 /
其他回答
我的解决方案如下
(\[‘])。* 1 (? ! [s ^ \])
演示链接:https://regex101.com/r/jlhQhV/1
解释:
(["'])->匹配'或',一旦找到匹配,将其存储在反向引用\1中
.* ->贪婪的方法继续匹配所有内容0次或更多次,直到它在字符串末尾遇到'或"。遇到这种状态后,正则表达式引擎返回到上一个匹配字符,此时正则表达式结束,将移动到下一个正则表达式。
\1 ->匹配先前与第一个捕获组匹配的字符或字符串。
(?![^\s]) ->负前向,确保在之前的匹配之后不应该有任何非空格字符
一般来说,下面的正则表达式片段就是你要找的:
"(.*?)"
这使用了非贪婪的*?运算符来捕获下一个双引号之前的所有内容。然后,使用特定于语言的机制提取匹配的文本。
在Python中,你可以这样做:
>>> import re
>>> string = '"Foo Bar" "Another Value"'
>>> print re.findall(r'"(.*?)"', string)
['Foo Bar', 'Another Value']
对于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
模式(["'])(?:(?=(\\?))\2.)*?上面的\1完成了这项工作,但我担心它的性能(它不差,但可以更好)。我的比它快20%。
模式“(.*?)”是不完整的。我对阅读这篇文章的人的建议是不要使用它!!
例如,它不能捕获很多字符串(如果需要,我可以提供一个详尽的测试用例),如下所示:
$string = '你好吗?我很好,谢谢你;
其余的都和上面那个一样“好”。
如果你真的关心性能和精度,那么就从下面的开始:
/(['"])((\\\ 1 |。)* ?)\ 1 /通用
在我的测试中,它涵盖了我遇到的每一个字符串,但如果你发现一些不工作的东西,我很乐意为你更新它。
在在线正则表达式测试器中检查我的模式。
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)
试试这个,就像一个魅力!!
\表示跳过字符