易语言正则表达式
正则表达式是一种用来匹配字符串的工具,易语言中也内置了正则表达式的支持。本文将介绍易语言中如何使用正则表达式进行字符串匹配。
正则表达式语法
在使用正则表达式之前,需要了解一下正则表达式的语法。下表列举了常用的正则表达式语法:
语法 | 描述 |
---|---|
. | 匹配除换行符以外的任意字符 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
* | 匹配前面的字符出现零次或多次 |
+ | 匹配前面的字符出现一次或多次 |
? | 匹配前面的字符出现零次或一次 |
{n} | 匹配前面的字符恰好出现n次 |
{n,} | 匹配前面的字符至少出现n次 |
{n,m} | 匹配前面的字符出现n到m次 |
[] | 匹配中括号中的任意一个字符 |
[^] | 匹配中括号中没有包含的任意一个字符 |
| | 匹配竖线左右两边的表达式中的任意一个 |
在易语言中使用正则表达式
易语言的正则表达式支持使用^
和$
匹配字符串的开头和结尾,使用.
匹配除换行符以外的任意字符,使用*
、+
和?
匹配前面的字符出现的次数,使用{}
匹配前面的字符出现的次数,使用[]
和[^]
匹配中括号内的字符。
使用易语言中的Match
函数进行正则表达式匹配,函数原型如下:
Match(str, pattern)
其中str
为要进行匹配的字符串,pattern
为正则表达式模式。
下面是一个简单的示例代码,匹配字符串中是否包含数字:
$include("E:\EASYWIN\bin\EasyNewType_1.5\folder\winQX_Define.c")
$include("E:\EASYWIN\bin\EasyNewType_1.5\folder\winQX_System.c")
// 匹配字符串中是否包含数字
Function Main()
Var s:String = "hello123world"
Var pattern:String = "[0-9]"
If Match(s, pattern) Then
MsgBox("包含数字")
Else
MsgBox("不包含数字")
EndIf
EndFunc
在上面的示例代码中,使用了正则表达式模式[0-9]
,该模式可以匹配字符串中的数字字符。
高级正则表达式语法
除了上面介绍的常用的正则表达式语法外,正则表达式还有很多高级语法,比如使用括号进行分组匹配、使用捕获组进行字符串的提取等等。下面我们来介绍一下在易语言中如何使用这些高级正则表达式语法。
分组匹配
使用括号进行分组匹配可以方便地从匹配的字符串中提取需要的内容。括号内的正则表达式被视为一个整体,可以对整个括号内的表达式进行修饰符和量词的操作。
下面是一个例子,从一个URL字符串中提取出域名:
$include("E:\EASYWIN\bin\EasyNewType_1.5\folder\winQX_Define.c")
$include("E:\EASYWIN\bin\EasyNewType_1.5\folder\winQX_System.c")
// 提取URL中的域名
Function Main()
Var url:String = "https://www.baidu.com/"
Var pattern:String = "https?://([a-zA-Z0-9]+\.)+[a-zA-Z]{2,6}"
Var result:String
If Match(url, pattern, result) Then
MsgBox(result)
Else
MsgBox("未匹配到域名")
EndIf
EndFunc
在上面的示例代码中,使用了正则表达式模式https?://([a-zA-Z0-9]+\.)+[a-zA-Z]{2,6}
,该模式首先匹配字符串中以http
或https
开头,然后使用括号将一个域名进行分组匹配,其中[a-zA-Z0-9]+\.
表示匹配一个包含字母和数字的域名级别,+
表示匹配一个或多个字符,\.
表示匹配一个.
字符,最后使用[a-zA-Z]{2,6}
匹配最后一个域名级别,其中{2,6}
表示该域名级别的长度在2到6个字符之间。
在Match
函数中,除了要传入要匹配的字符串和正则表达式模式外,还需要传入一个引用类型的变量作为结果,该变量将存储匹配到的字符串。在本例中,使用result
变量存储匹配到的域名字符串。
捕获组
捕获组是我们能够从匹配的字符串中提取到特定部分的工具。除了分组匹配,捕获组还可以把匹配到的字符串提取出来。
下面是一个例子,从一个HTML代码字符串中提取出所有的<a>
标签:
$include("E:\EASYWIN\bin\EasyNewType_1.5\folder\winQX_Define.c")
$include("E:\EASYWIN\bin\EasyNewType_1.5\folder\winQX_System.c")
// 提取HTML代码中的所有<a>标签
Function Main()
Var html:String = "<html><body><a href='https://www.baidu.com'>Baidu</a></body></html>"
Var pattern:String = "<a[^>]*>([^<]*)</a>"
Var matches:Ptr = New(1024) ' 分配内存空间用于存储匹配结果
Var count:Int = MatchAll(html, pattern, matches)
For i = 0 To count - 1
Var match:Ptr = matches + i * 2 ' 每个匹配结果存储在2个内存地址中,根据偏移量获取匹配结果
Var result:String = PeekStr(match)
MsgBox(result)
Next
Free(matches) ' 释放内存空间
EndFunc
在上面的示例代码中,使用了正则表达式模式<a[^>]*>([^<]*)</a>
,该模式使用捕获组([^<]*)
匹配<a>
标签中间的字符串。在MatchAll
函数中,除了要传入要匹配的字符串和正则表达式模式外,还需要传入一个指针类型的变量作为结果。该变量将存储所有的匹配结果,返回值为匹配结果的个数。
由于MatchAll
函数返回的是所有匹配结果的指针数组,需要根据偏移量获取每个匹配结果。在本例中,偏移量为i * 2
,每个匹配结果存储在2个内存地址中。
结论
正则表达式是一种十分强大的字符串匹配工具,易语言的正则表达式支持可以很方便地进行字符串匹配和提取。除了本文中介绍的常用正则表达式语法外,还有很多高级正则表达式语法可以使用。掌握正则表达式的使用,可以让我们更快速地处理字符串。