-2

我正在从一些基本字符串中为与正则表达式相关的操作制作许多字符串,我想知道是否有一种不那么冗长的方法来编写它。

我有我的基本字符串:

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})"
4

1 回答 1

0

我认为对于像编写正则表达式这样的问题,您可能需要比格式字符串更健壮的东西。例如,声明一个 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 不喜欢这个结果,所以它可能需要调整。

于 2021-05-10T21:11:47.163 回答