在定界符之间匹配转义字符和转义字符本身

Match escaped character and escaping character itself between delimiters

问题

假设您有一个字符串,其中包含一个或多个随机字符序列或由特定字符分隔的单词,比方说单引号。不是定界符的单引号由反斜杠转义。

例如:

字符串

'word' 'word word' 'word\'word' '\' '\' '\''

需要捕获

  1. 'word'
  2. 'word word'
  3. '字\'word'
  4. '\'
  5. '\\'
  6. '\''

基本上必须捕获非转义单引号之间的每个字符序列。

困难

捕获#4 和#5 都有一个单引号定界符被反斜杠转义。事实上,这应该被理解为单引号分隔符之间的反斜杠。

到目前为止,除了#6 之外,我已经能够捕捉到所有内容。我曾经遵循正则表达式:

'((\'[^\s]|[^'])*)'

我觉得这很奇怪,因为我认为这会捕获不包含单引号的单引号之间的每个字符序列,但转义单引号后跟非空白字符除外。所以我不知道为什么 #6 没有被这个表达式捕获。

'(?:[^'\]|\'(?!\s))*'|'\+'

您可以使用这个 instead.See 演示。

https://regex101.com/r/sS2dM8/35

基本上你需要匹配所有不是引号的字符或任何用反斜杠转义的字符(包括单引号或反斜杠本身):

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

为了使这个模式高效,你可以这样重写它(没有交替):

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