【问题标题】:Reducing Verbosity in formatted strings (Stanza)减少格式化字符串中的冗长(Stanza)
【发布时间】:2023-03-24 16:55:01
【问题描述】:

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

我有我的基本字符串:

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 string-formatting stanza


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      相关资源
      最近更新 更多