我想匹配以下字符串:
The sentence is 'He said "Hello there"'
The sentence is "He said 'Hello there'"
并获取单个捕获(匹配),即外部单引号或双引号内的句子。
^The sentence is (?:(?:'([^']*)')|(?:"([^"]*)"))$
上面的正则表达式给了我2个被捕获的组,其中一个是空的,另一个包含所需的句子。
^The sentence is (['"])(.*)\1$
将引号(单引号或双引号)作为第一组返回,将句子作为第二组返回。
如果我让第一组不捕获,
^The sentence is (?:['"])(.*)\1$
然后我不能使用后来对被捕获组的引用。 (当然,\ 1不再是指单引号或双引号匹配)
有没有办法让团队获得"捕获"可以在后面的正则表达式中引用,但其匹配列表中不会返回其捕获的值?
或者其他一些解决我(看似简单)问题的方法。
答案 0 :(得分:6)
这个似乎有效:
(?:'|").*(?:'|")
或
((?:'|").*(?:'|"))
如果你需要一个小组。
这是演示:link
它有效,因为*
是一个贪婪的量词,所以你不必知道最后是什么类型的引用。 *
将尽可能多地使用。
答案 1 :(得分:2)
您希望确保引号符号正确匹配,因此以单引号开头的引号以单引号结尾。此外,正则表达式应该允许使用反斜杠转义引号,如果它是绑定字符串的相同符号(双引号或单引号符号)。试试这个:
"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'
这些样本符合此正则表达式:
'sing"le q\'uote'
"dou\"ble 'quote"
答案 2 :(得分:2)
非常难过,但是这种优雅而准确的方法不起作用:
(["'])(?:\\\1|[^\1]+)*\1
但是我们可以对其进行一些更改,并且一切正常:
(["'])((?:\\\1|(?:(?!\1)).)*)(\1)
https://regex101.com/r/dKdBMT/2
我想确保此正则表达式在所有情况下都可以使用:请对其进行更多测试。
答案 3 :(得分:0)
以上之一非常准确。但是,需要一些更新。这是:
(["'])((?:\\1|(?:(?!\1)).)*)(\1)
这会将所有内容作为字符串文字进行匹配。