用于查找 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 的正则表达式引擎执行以下操作。
(?<= 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]+)```(?!`)
您会看到这个正则表达式有两个捕获组。如果有一个反引号匹配,则反引号之间的部分保存在捕获组 1 中,并且不会创建捕获组 2,如果有三个反引号匹配,则三重反引号之间的部分保存在捕获组 2 中,并且未创建捕获组 1。
我正在尝试想出一个匹配反引号内部的正则表达式,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 的正则表达式引擎执行以下操作。
(?<= 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]+)```(?!`)
您会看到这个正则表达式有两个捕获组。如果有一个反引号匹配,则反引号之间的部分保存在捕获组 1 中,并且不会创建捕获组 2,如果有三个反引号匹配,则三重反引号之间的部分保存在捕获组 2 中,并且未创建捕获组 1。