我想匹配以下字符串:
The sentence is 'He said "Hello there"'
The sentence is "He said 'Hello there'"
Run Code Online (Sandbox Code Playgroud)
并获取单个捕获(匹配),即外部单引号或双引号内的句子.
^The sentence is (?:(?:'([^']*)')|(?:"([^"]*)"))$
Run Code Online (Sandbox Code Playgroud)
上面的正则表达式给了我2个被捕获的组,其中一个是空的,另一个包含所需的句子.
^The sentence is (['"])(.*)\1$
Run Code Online (Sandbox Code Playgroud)
返回引号(单引号或双引号)作为第1组,将句子作为第2组.
如果我让第一组不捕获,
^The sentence is (?:['"])(.*)\1$
Run Code Online (Sandbox Code Playgroud)
然后我不能使用后来对被捕获组的引用.(\ 1当然不再是指单引号或双引号匹配)
有没有办法让那些"捕获"的组可以在后面的正则表达式中引用,但其捕获的值不会在匹配列表中返回?
或者其他一些方法来解决我(看似简单)的问题.
很伤心,但是这样优雅准确的方法行不通:
(["'])(?:\\\1|[^\1]+)*\1
Run Code Online (Sandbox Code Playgroud)
但是我们可以稍微改变一下,一切正常:
(["'])((?:\\\1|(?:(?!\1)).)*)(\1)
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/dKdBMT/2
我想确保这个正则表达式适用于所有情况:请更多地测试它。
这个似乎工作:
(?:'|").*(?:'|")
Run Code Online (Sandbox Code Playgroud)
要么
((?:'|").*(?:'|"))
Run Code Online (Sandbox Code Playgroud)
如果你需要一个团体.
这是演示:链接
它是有效的,因为它*是一个贪婪的量词,所以你不必知道最后是什么样的引用.*将采取尽可能多的.
您要确保引号正确匹配,因此以单引号开头的引号以单引号结尾。此外,正则表达式应该允许使用反斜杠转义引号,如果它是限制字符串的相同符号(双引号或单引号符号)。尝试这个:
"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'
这些示例与此正则表达式匹配:
'sing"le q\'uote'
"dou\"ble 'quote"