我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
我的值是这样的:
"Foo Bar" "Another Value" something else
什么正则表达式将返回括在引号中的值(例如Foo Bar和Another Value)?
当前回答
我的解决方案如下
(\[‘])。* 1 (? ! [s ^ \])
演示链接:https://regex101.com/r/jlhQhV/1
解释:
(["'])->匹配'或',一旦找到匹配,将其存储在反向引用\1中
.* ->贪婪的方法继续匹配所有内容0次或更多次,直到它在字符串末尾遇到'或"。遇到这种状态后,正则表达式引擎返回到上一个匹配字符,此时正则表达式结束,将移动到下一个正则表达式。
\1 ->匹配先前与第一个捕获组匹配的字符或字符串。
(?![^\s]) ->负前向,确保在之前的匹配之后不应该有任何非空格字符
其他回答
我一直在使用以下方法并取得了巨大的成功:
(["'])(?:(?=(\\?))\2.)*?\1
它还支持嵌套引号。
对于那些想要更深入地解释这是如何工作的人,这里是用户ephemerent的解释:
([""'])匹配引号;((?=(\\?))\2.)如果存在反斜杠,吞噬它,无论是否发生,匹配一个字符;* ?匹配多次(非贪婪,如不吃结尾引号);\1匹配相同的报价,是用于开幕。
我认为:
"([^"]*)"
[^"]是除'"'以外的任何字符的正则表达式 我用这个代替非贪婪多算子的原因是我需要不断地查找以确保我得到的是正确的。
与亚当的答案不同,我有一个简单但有效的答案:
(["'])(?:\\\1|.)*?\1
如果你想要得到引号中的内容,只需添加圆括号:
(["'])((?:\\\1|.)*?)\1
$1匹配引号字符,$2匹配内容字符串。
接受的答案的RegEx返回值,包括它们的寻源引号:“Foo Bar”和“Another Value”作为匹配。
下面是RegEx,它只返回引号之间的值(正如提问者所要求的那样):
仅使用双引号(使用捕获组#1的值):
"(.*?[^\\])"
仅使用单引号(使用捕获组#1的值):
'(.*?[^\\])'
Both(使用捕获组#2的值):
([']) "(. *? 1 \ [^ \ \])
-
全部支持转义和嵌套引号。
特别的是,这些答案都不会产生一个正则表达式,其中返回的匹配是所要求的引号内的文本。MA-Madden尝试了,但只获得了内部匹配,而不是整个匹配。一种实际的方法是:
(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)
这方面的例子可以在这个演示https://regex101.com/r/Hbj8aP/1中看到
The key here is the the positive lookbehind at the start (the ?<= ) and the positive lookahead at the end (the ?=). The lookbehind is looking behind the current character to check for a quote, if found then start from there and then the lookahead is checking the character ahead for a quote and if found stop on that character. The lookbehind group (the ["']) is wrapped in brackets to create a group for whichever quote was found at the start, this is then used at the end lookahead (?=\1) to make sure it only stops when it finds the corresponding quote.
唯一的另一个复杂之处在于,由于前向查询实际上并不使用结束引号,它将被开始后向查询再次找到,这将导致匹配同一行上结束引号和开始引号之间的文本。在开头引用(["']\b)上加上一个单词边界有助于解决这个问题,尽管理想情况下我想跳过前瞻,但我认为这是不可能的。中间允许转义字符的部分直接取自亚当的回答。