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

时间:2017-10-27 04:20:48

标签: regex

我想匹配以下字符串:

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

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

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

4 个答案:

答案 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)

这会将所有内容作为字符串文字进行匹配。