Regex 用于查找1个backtick和3个backtick的匹配组的正则表达式

Regex 用于查找1个backtick和3个backtick的匹配组的正则表达式,regex,regex-group,Regex,Regex Group,我试图找到一个正则表达式,它可以匹配backtick的内部,1或3 我有以下适用于1 backtick的正则表达式: `(.*?)` 这一个与3: ```(.*?)``` 我想将它们合并到一个正则表达式搜索中,我尝试了类似的方法 (`|```)(.*?)(`|```) 但这会创建太多的比赛组,我尝试了$和^,但这些似乎是一行的开始和结束 边缘情况1: My SQL Statement is below: ``` SQL_STATEMENT = "SELECT * FROM `table`

我试图找到一个正则表达式,它可以匹配backtick的内部,1或3

我有以下适用于1 backtick的正则表达式:

`(.*?)`
这一个与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";
```
应分为两组:

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

边缘案例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";
应该有两组

table

捕获1个或3个回溯标记,并在结尾使用回溯引用,以便要求它们保持平衡

简单版本:

(`(?:``)?)([^`]+)\1
仅平衡版本。即开始和结束时反勾号的数量相同

(?<=[^`]|^)(`(?:``)?)([^`]+)\1(?=[^`]|$)
您的目标内容在第2组中

请参阅。

捕获1个或3个回溯标记,并在末尾使用回溯引用,以便要求它们保持平衡

简单版本:

(`(?:``)?)([^`]+)\1
仅平衡版本。即开始和结束时反勾号的数量相同

(?<=[^`]|^)(`(?:``)?)([^`]+)\1(?=[^`]|$)
您的目标内容在第2组中


请参阅。

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

匹配字符串


您将看到这个正则表达式有两个捕获组。如果有一个反勾号匹配,则反勾号之间的部分保留在捕获组1中,而不创建捕获组2;如果有三个反勾号匹配,则反勾号三元组之间的部分保留在捕获组2中,而不创建捕获组1。

这里有两种方法

匹配字符串



您将看到这个正则表达式有两个捕获组。如果有一个反勾号匹配,则反勾号之间的部分保留在捕获组1中,而不创建捕获组2;如果有三个反勾号匹配,则反勾号三元组之间的部分保留在捕获组2中,而不创建捕获组1。

谢谢!这对我有用。。。唯一的问题是,我认为如果你在3个刻度内嵌套1个刻度,它更喜欢内部嵌套,这没什么大不了的,只是一个边缘案例,看看最新版本是否适合你。如果没有,请发布您的边缘案例。发布新问题或修改我当前的问题?修改当前问题。它怀疑您的edge case是一个合理的东西,希望这个正则表达式可以使用。是的,添加到原始问题中谢谢!这对我有用。。。唯一的问题是,我认为如果你在3个刻度内嵌套1个刻度,它更喜欢内部嵌套,这没什么大不了的,只是一个边缘案例,看看最新版本是否适合你。如果没有,请发布您的边缘案例。发布新问题或修改我当前的问题?修改当前问题。它怀疑您的edge case是一个合理的东西,希望这个正则表达式可以使用。是的,添加到您可以使用的原始问题中?为边缘案例设置单线模式标志,但对其他示例不起作用@CarySwoveland你能把这个作为一个答案写下来吗,很难在内联中看到它,我认为解决方案中的反勾号现在可以了吗?我躲过了背虱,所以可以看到它们。当然,你也可以在自然链接上看到它。@CarySwoveland这个解决方案不会检测到单线回跳,比如'2343245'是的,我说过了。它简单地抓住了三个回跳、回跳和所有回跳对之间的所有内容。这只是你的边缘案例。你可以用?为边缘案例设置单线模式标志,但对其他示例不起作用@CarySwoveland你能把这个作为一个答案写下来吗,很难在内联中看到它,我认为解决方案中的反勾号现在可以了吗?我躲过了背虱,所以可以看到它们。当然,你也可以在自然链接上看到它。@CarySwoveland这个解决方案不会检测到单线回跳,比如'2343245'是的,我说过了。它简单地抓住了三个回跳、回跳和所有回跳对之间的所有内容。这只是你的边缘案例的例子。
(?<=(?<!`)`)[^`\r\n]+(?=`(?!`))|(?<=(?<!`)```)[^`\r\n]+(?=```(?!`))
(?<=       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]+)```(?!`)