import Foundation
let pattern = ##"""
(?: # 采用非捕获括号进行分组(非必要不使用捕获型括号)
(`{3,}) # 捕获组,匹配三个及以上反引号,并进行捕获
[\s\S]*? # 采用非贪婪匹配(必须),匹配0到n次空白或非空白字符(任意字符)
(?:(?:\1`*)|\Z) # 引用,引用了之前的捕获组,若之前捕获了5个反引号,则在此必须匹配5个以上反引号,若开头三个以上反引号,后面没有比开头更多的反引号,则后面都是代码块
) # 结束第一个分支
| # 或符号
(?: # 同上,采用非捕获型括号
(~{3,}) # 同上,匹配三个及以上波浪号并进行捕获
[\s\S]*? # 同上,非贪婪匹配来匹配0到n次空白或非空白字符
(?:(?:\2~*)|\Z) # 引用,引用了之前的捕获组
) # 结束第二个分支
| # 或符号
(?: # 同上,采用非捕获型括号
(?<= # 肯定型逆序环视,左侧文本必须满足条件才可以匹配
(?:^\n)|(?:^\A) # 上一行必须只有一个回车(以回车符号开头)或没有上一行
) # 结束环视
(?: # 采用非捕获型括号分组
(?:\s{4,}?|\t+?)[^\n]*(?:\n|$) # 匹配四个及以上空格或一个以上制表符开启的一行
)+ # 上面的子组匹配1次到n次
) # 结束第三个分支
"""##
let regex = try! NSRegularExpression(pattern: pattern, options: [.anchorsMatchLines, .allowCommentsAndWhitespace])
let testString = #"""
this is a code block
// 1. 匹配四个空格导出的代码块
functino(asfd)
safdsadf
safsadf
safdsdaf
// 2. 匹配三个反引号所引出的代码块
```
func function(){
}
```
这里是一些文本
……
………………
``` python
print("hello")
```
// 3.如果四个空格之前的一行不是回车独占一行,则不会导出代码块(符合Markdown约定)
function(asfd)
safdsadf
safsadf
safdsdaf
safd
// 4. 匹配三个波浪号导出的代码块
~~~
fmt.println(123)
~~~
// 5. 匹配前后四个及以上反引号导出的代码块
````
aaa
```
````
这里是一些文本……
`````
print("this is a code block")
`````
`````
print("this is a code block")
````````````````````````
// 6. 匹配前后四个及以上波浪号导出的代码块
~~~~
aaa
~~~
~~~~
这里是一些文本……
~~~~~~
print("this is a code block")
~~~~~~
~~~~~~
print("this is a code block")
~~~~~~~~~~~~~~~~~~~~~~~~
// 7. 只有开头,没有结尾的,都算代码块
```
asdfasdf
asdfasdf
asdfasdf
asdfasdf
asdfasdf
asdf
没有结尾,这里也算代码块
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let substitutionString = #""#
let result = regex.stringByReplacingMatches(in: testString, range: stringRange, withTemplate: substitutionString)
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression