概要
nimの正規表現ライブラリの操作コツコツと。
reモジュールではなく、nreモジュールを利用しています。
nreモジュールは、optionsライブラリを利用しているっぽく、ちょっとモダンな雰囲気がする正規表現ライブラリとなっています。
以下メモ
マッチ
import nre,options,strutils
block:
echo "1.match=>","abc".match(re"abc")
echo "2.match=>","abcdef".match(re"^abc")
echo "3.unmatch=>","abcdef".match(re"def$")
echo "4.match=>","abcdef".match(re".+def$")
(stdout)
1.match=>Some(abc)
2.match=>Some(abc)
3.unmatch=>None[RegexMatch]
4.match=>Some(abcdef)
検索
import nre,options,strutils
block:
echo "1.find=>","abc".find(re"abc")
echo "2.find=>","abcdef".find(re"^abc")
echo "3.find=>","abcdef".find(re"def$")
echo "4.find=>","abcdef".find(re".+def$")
(stdout)
1.find=>Some(abc)
2.find=>Some(abc)
3.find=>Some(def)
4.find=>Some(abcdef)
分割(split)
import nre,options,strutils
block:
let s1 = "Test,test; test. Test."
echo s1.split(re"[,;.] ?") == @["Test", "test", "test", "Test", ""]
echo s1.split(re"([,;.]) ?") == @["Test", ",", "test", ";", "test", ".", "Test", ".", ""]
(stdout)
true
true
置換(置換指定のパターンがいくつかありますよ)
import nre,options,strutils
block:
# procで置換
echo "1.replace=>","abc".replace( re"(\w)", proc (m: RegexMatch) : string =
#var s:string = m.match
#m.str.toUpper
m.match.toUpper
)
# procで置換
echo "2.replace=>","abc".replace( re"(abc)", proc (m: string) : string =
m & "HELLO"
)
# 文字列で置換
echo "3.replace=>","abcdef".replace( re"(?<word1>abc)(?<word2>def)", "[[$word1][$word2]]")
# doで置換
echo "4.replace=>", "abc".replace(re"(abc)")
do (m: string) -> string :
m & "HELLO"
(stdout)
1.replace=>ABC
2.replace=>abcHELLO
3.replace=>[[abc][def]]
4.replace=>abcHELLO
オプションテスト(マッチ後のオブジェクト)
import nre,options,strutils
block:
var m = "abc123DEF".match(re"([a-z]+)\d+([A-Z]+)").get
echo "str=>",m.str
echo "match=>",m.match
echo "matchBounds=>",m.matchBounds
echo "captures[0]=>",m.captures[0]
echo "captures[1]=>",m.captures[1]
(stdout)
str=>abc123DEF
match=>abc123DEF
matchBounds=>(a: 0, b: 8)
captures[0]=>abc
captures[1]=>DEF
iteratorサンプル
import nre,options,strutils
block:
let line = "123 456 789"
for m in line.findIter(re"\d+") :
echo m.match
(stdout)
123
456
789