我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
当前回答
我喜欢Eugen Mihailescu的解决方案,在允许转义引号的同时匹配引号之间的内容。然而,我发现了一些转义的问题,并提出了以下正则表达式来解决它们:
(['"])(?:(?!\1|\\).|\\.)*\1
它做到了这一点,而且仍然非常简单,易于维护。
演示(包含更多的测试用例;请随意使用并扩展它)。
PS:如果你只是想在引号之间的内容完全匹配($0),并不怕性能惩罚使用:
(?<=(['"])\b)(?:(?!\1|\\).|\\.)*(?=\1)
不幸的是,没有引号作为锚,我不得不添加一个边界\b,它不能很好地处理开始引号后的空格和非单词边界字符。
或者,修改初始版本,只需添加一个组,并从$2中提取字符串:
(['"])((?:(?!\1|\\).|\\.)*)\1
PPS:如果你只关注效率,那就选择Casimir和Hippolyte的解决方案;这是一个很好的例子。
其他回答
与亚当的答案不同,我有一个简单但有效的答案:
(["'])(?:\\\1|.)*?\1
如果你想要得到引号中的内容,只需添加圆括号:
(["'])((?:\\\1|.)*?)\1
$1匹配引号字符,$2匹配内容字符串。
这个版本
转义引号的说明 控制回溯 /(["'])((?:(?!\ 1 )[^\\]|(?:\\\\)*\\[^\\])*)\ 1 /
我能够创建这个正则表达式来满足我的需求。
我需要匹配一个包含引号的特定值。它必须是完全匹配的,没有部分匹配可以触发命中
如。“test”不能与“test2”匹配。
reg = r"""(['"])(%s)\1"""
if re.search(reg%(needle), haystack, re.IGNORECASE):
print "winning..."
猎人
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)
试试这个,就像一个魅力!!
\表示跳过字符
echo 'junk "Foo Bar" not empty one "" this "but this" and this neither' | sed 's/[^\"]*\"\([^\"]*\)\"[^\"]*/>\1</g'
这将导致:>Foo Bar<><>但这<
在这里,为了清晰起见,我显示了><'s之间的结果字符串,也使用了这个sed命令的非贪婪版本,我们首先抛出' 's之前和之后的垃圾,然后用' ' 's之间的部分替换它,并用><'s包围它。