用于查找 1 个反引号和 3 个反引号的匹配组的正则表达式

Regex for finding match groups for 1 backtick and 3 backtick

我正在尝试想出一个匹配反引号内部的正则表达式,1 或 3。

我有以下适用于 1 个反引号的正则表达式:

`(.*?)`

这一个适用于 3:

```(.*?)```

我想将它们组合成一个正则表达式搜索,我试过类似

(`|```)(.*?)(`|```)

但这会创建太多匹配组,我已经尝试了 $^,但它们似乎是行首和行尾...

边缘情况 1:

My SQL Statement is below:
```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
```

应该有 1 个组:

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";

边缘案例 2

My SQL Statement is below:
```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
```

```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";
```

应该有 2 个组:

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";

边缘案例 3

My SQL Statement is below:
```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";
```

应该有1组:

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";

应该将整个块放在一个组中


边缘案例 4

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";

应该有2组

table

id

捕获 1 个 3 个反引号并在末尾使用反向引用,因此要求它们平衡。

简单版:

(`(?:``)?)([^`]+)

仅平衡版本。 (即开始和结束时反引号的数量相同)

(?<=[^`]|^)(`(?:``)?)([^`]+)(?=[^`]|$)

您的目标(内容)在第 2 组中

参见live demo

这里有几种方法可以做到这一点。

匹配字符串

(?<=(?<!`)`)[^`\r\n]+(?=`(?!`))|(?<=(?<!`)```)[^`\r\n]+(?=```(?!`))

请注意,此正则表达式没有捕获组。

PCRE (PHP) Demo

PCRE 的正则表达式引擎执行以下操作。

(?<=       begin a positive lookbehind
  (?<!`)   following is not preceded by a backtick
  `        match a backtick
)          end positive lookbehind
[^`\r\n]+  match 1+ chars other than backtick, CR or newline
(?=        begin positive lookahead
  `        match a backtick
  (?!`)    not followed by a backtick
)          end positive lookhead
|
(?<=       begin a positive lookbehind
  (?<!`)   following is not preceded by a backtick
  ```      match 3 backticks
)          end positive lookbehind
[^`\r\n]+  match 1+ chars other than backtick, CR or newline
(?=        begin positive lookahead
  ```      match 3 backticks
  (?!`)    not followed by a backtick
)          end positive lookhead

(?<!...) 是一个负面回顾(?!...) 是一个 负前瞻

使用捕获组

(?<!`)`([^`\r\n]+)`(?!`)|(?<!`)```([^`\r\n]+)```(?!`)

PCRE (PHP) Demo

您会看到这个正则表达式有两个捕获组。如果有一个反引号匹配,则反引号之间的部分保存在捕获组 1 中,并且不会创建捕获组 2,如果有三个反引号匹配,则三重反引号之间的部分保存在捕获组 2 中,并且未创建捕获组 1。