regex 示例
RegexOption 获取当前正则匹配模式
import std.regex.*
main(): Unit {
var a = RegexOption()
println(a.toString())
a = RegexOption().ignoreCase()
println(a.toString())
a = RegexOption().multiLine()
println(a.toString())
a = RegexOption().multiLine().ignoreCase()
println(a.toString())
}
运行结果:
NORMAL,NFA
IGNORECASE,NFA
MULTILINE,NFA
MULTILINE,IGNORECASE,NFA
Regex 匹配大小写
import std.regex.*
main(): Unit {
let r1 = Regex("ab")
let r2 = Regex("ab", RegexOption().ignoreCase())
match (r1.matches("aB")) {
case Some(r) => println(r.matchStr())
case None => println("None")
}
match (r2.matches("aB")) {
case Some(r) => println(r.matchStr())
case None => println("None")
}
}
运行结果:
None
aB
MatchOption 匹配多行
import std.regex.*
main(): Unit {
let rule = ##"^(\w+)\s(\d+)*$"##
let pattern: String = """
Joe 164
Sam 208
Allison 211
Gwen 171
"""
let r1 = Regex(rule, RegexOption().multiLine())
var arr = r1.matcher(pattern).findAll() ?? Array<MatchData>()
for (md in arr) {
println(md.matchStr())
}
}
运行结果:
Joe 164
Sam 208
Allison 211
Gwen 171
Matcher 和 MatchData 的使用
import std.regex.*
main(): Unit {
let r = Regex(#"a\wa"#).matcher("1aba12ada555")
for (_ in 0..2) {
let matchData = r.find()
match (matchData) {
case Some(md) =>
println(md.matchStr())
let pos = md.matchPosition()
println("[${pos.start}, ${pos.end})")
case None => println("None")
}
}
}
运行结果:
aba
[1, 4)
ada
[6, 9)
Matcher 中 resetString/fullMatch/matchStart 函数
import std.regex.*
main(): Unit {
let r = Regex("\\d+")
let m = r.matcher("13588123456")
let matchData1 = m.fullMatch()
m.resetString("13588abc")
let matchData2 = m.matchStart()
m.resetString("abc13588123abc")
let matchData3 = m.matchStart()
match (matchData1) {
case Some(md) => println(md.matchStr())
case None => println("None")
}
match (matchData2) {
case Some(md) => println(md.matchStr())
case None => println("None")
}
match (matchData3) {
case Some(md) => println(md.matchStr())
case None => println("None")
}
}
运行结果:
13588123456
13588
None
Matcher 中 replace/replaceAll 函数
import std.regex.*
main(): Unit {
let r = Regex("\\d").matcher("a1b1c2d3f4")
println(r.replace("X")) //replace a digit once with X
println(r.replace("X", 2)) //replace once from index 4
println(r.replaceAll("X")) //replace all digit with X
println(r.replaceAll("X", 2)) //replace all at most 2 times
println(r.replaceAll("X", -1)) //replace all digit with X
}
运行结果:
aXb1c2d3f4
a1bXc2d3f4
aXbXcXdXfX
aXbXc2d3f4
aXbXcXdXfX
Matcher 获取匹配总数
import std.regex.*
main(): Unit {
var matcher = Regex("a+b").matcher("1ab2aab3aaab4aaaab")
println(matcher.allCount())
}
运行结果:
4
MatchData 中 groupNumber 函数
import std.regex.*
main(): Unit {
var r = Regex("(a+c)(a?b)()(()?c+((e|s([a-h]*))))")
var m = r.matcher("aacbcsdedd")
var matchData = m.find()
match (matchData) {
case Some(s) =>
println("groupNum : ${s.groupNumber()}")
if (s.groupNumber() > 0) {
for (i in 1..=s.groupNumber()) {
println("group[${i}] : ${s.matchStr(i)}")
var pos = s.matchPosition(i)
println("position : [${pos.start}, ${pos.end})")
}
}
case None => ()
}
}
运行结果:
groupNum : 8
group[1] : aac
position : [0, 3)
group[2] : b
position : [3, 4)
group[3] :
position : [4, 4)
group[4] : csdedd
position : [4, 10)
group[5] :
position : [10, 10)
group[6] : sdedd
position : [5, 10)
group[7] : sdedd
position : [5, 10)
group[8] : dedd
position : [6, 10)