识别引号中字符串的最佳方法

Best way to recognize a string in quotes

匹配以下内容的正则表达式是什么?

1 foo(不带引号的字符串)

2 "foo"(双引号内的字符串)

3 'foo'(单引号内的字符串)

4 "fo\"o"(带有转义引号的字符串)

5 'fo\'o'(带有转义引号的字符串)

到目前为止我已经想出了这个正则表达式:

[a-z]+|"[a-z]+"|'[a-z]+'

但它不考虑情况 4 和 5。

我觉得我可以解决这个问题(否定,嵌套组,看起来又丑又慢),但我不知道如何以优雅的方式实现它。

这是有效的正则表达式:

^(\"(?:(?:\w|\")+)\"|\'(?:(?:\w|\')+)\'|\w+)$

查看 Regex101 上的演示并阅读说明。先讲一点理论:

  • ^ 是字符串的开头,$ 是结尾
  • (?:) 是非捕获组,这里仅用于重复定义
  • | 是组的各个部分之间的 分隔符。

现在正则表达式本身:

  • \"(?:(?:\w|\")+)\""Foo""Fo\"o"的可能匹配。
    • (?:\w|\")+ 代表至少一个单词或转义的 " 字符。
    • \"是周围的字符
  • \'(?:(?:\w|\')+)\' 与上面相同,但对于 ' 字符匹配 'Foo''Fo\'o'.
  • \w+代表任意一个词

你可以将正则表达式理解为:

  • ^(match-with-double-quotations OR match-with-single-quotations OR match-a-word)$