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

时间:2018-08-24 21:19:40

标签: regex regex-negation regex-group

什么是符合以下条件的正则表达式?

1 df -hP /(不带引号的字符串)

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

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

4 'foo'(带转义引号的字符串)

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

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

'fo\'o'

但不考虑情况4和5。

我觉得我可以解决这个问题(使用否定,嵌套组,丑陋且缓慢),但是我不知道如何以一种优雅的方式做到这一点。

1 个答案:

答案 0 :(得分:2)

这是正常的正则表达式:

^(\"(?:(?:\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)$