问题描述
我正在从几个基本字符串中为与正则表达式相关的操作制作许多字符串,我想知道是否有一种不那么冗长的写法。
我有我的基本字符串:
val ALPHA = "[a-zA-Z]"
val ODD = "[13579]"
val EVEN = "[02468]"
val INEQ = "[<>]"
从这些构建的字符串:
val S1 = to-string $ "Today's math lesson is (%_) %_ (%_|%_)" % [ODD INEQ ODD EVEN]
val S2 = to-string $ "My boat is named (%_+)" % [ALPHA]
val S3 = to-string $ "Hashed password is ((?:%_|%_|%_)+)" % [ALPHA ODD EVEN]
... (many more)
理想情况下,我可以写一些类似
的东西evaluate-template $ "Today's math lesson is ({ODD}) {INEQ} ({ODD}|{EVEN})"
解决方法
我认为对于像编写正则表达式这样的问题,您可能需要比格式字符串更健壮的东西。例如,声明一个 Regex 类型:
deftype Regex:
String <: Regex
defstruct AnyOf <: Regex:
regexes:Tuple<Regex>
defmethod print (o:OutputStream,a:AnyOf):
val rs = regexes(a)
val last = length(rs) - 1
print(o,"(%*|%_)" % [rs[0 to last],rs[last]])
defstruct AllOf <: Regex:
regexes:Tuple<Regex>
defmethod print (o:OutputStream,a:AllOf):
print(o,"%*" % [regexes(a)])
defstruct AtLeastOne <: Regex:
regex:Regex
defmethod print (o:OutputStream,a:AtLeastOne):
print(o,"%_+" % [regex(a)])
defstruct ZeroOrMore <: Regex:
regex:Regex
defmethod print (o:OutputStream,a:ZeroOrMore):
print(o,"%_*" % [regex(a)])
val ALPHA: Regex = "[a-zA-Z]"
val ODD : Regex = "[13579]"
val EVEN : Regex = "[02468]"
val INEQ : Regex = "[<>]"
println(AllOf(["Today's math lesson is ",ODD," ",INEQ,AnyOf([ODD,EVEN])]))
这个程序打印:
Today's math lesson is [13579] [<>] ([13579]|[02468])
旁注:GNU grep 不喜欢这个结果,所以它可能需要调整。