正则表达式匹配单引号或双引号中的文本

Phi*_*vis 6 regex

我想匹配以下字符串:

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当然不再是指单引号或双引号匹配)

有没有办法让那些"捕获"的组可以在后面的正则表达式中引用,但其捕获的值不会在匹配列表中返回?

或者其他一些方法来解决我(看似简单)的问题.

red*_*sko 9

很伤心,但是这样优雅准确的方法行不通:

(["'])(?:\\\1|[^\1]+)*\1
Run Code Online (Sandbox Code Playgroud)

但是我们可以稍微改变一下,一切正常:

(["'])((?:\\\1|(?:(?!\1)).)*)(\1)
Run Code Online (Sandbox Code Playgroud)

https://regex101.com/r/dKdBMT/2

我想确保这个正则表达式适用于所有情况:请更多地测试它。


Ega*_*olf 5

这个似乎工作:

(?:'|").*(?:'|")
Run Code Online (Sandbox Code Playgroud)

要么

((?:'|").*(?:'|"))
Run Code Online (Sandbox Code Playgroud)

如果你需要一个团体.

这是演示:链接

它是有效的,因为它*是一个贪婪的量词,所以你不必知道最后是什么样的引用.*将采取尽可能多的.

  • 不。这将匹配正则表达式:'ss" (2认同)

tgo*_*eil 5

您要确保引号正确匹配,因此以单引号开头的引号以单引号结尾。此外,正则表达式应该允许使用反斜杠转义引号,如果它是限制字符串的相同符号(双引号或单引号符号)。尝试这个:

"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'

这些示例与此正则表达式匹配:

'sing"le q\'uote'

"dou\"ble 'quote"