【问题标题】:How to split a string on multiple regular expressions while keeping the splitting characters如何在多个正则表达式上拆分字符串,同时保留拆分字符
【发布时间】:2016-03-29 13:32:30
【问题描述】:

我是第一次编写词法分析器/扫描器,但遇到了拆分输入字符串的问题。 示例:

val result = "func add(Num x, Num y) = x+y;".split(???) 
result == Array("func", "add", "(", "Num", "x", ",", "Num", "y", ")", "=", "x", "+", "y", ";")

但问题是我不能简单地分割空白字符,例如,这样做不会将add( 分开。

有什么帮助吗?

【问题讨论】:

  • 不要 speak scala ;),所以我不能告诉你如何处理空条目,但在 \s|\b 上拆分 - 添加单词边界 - 应该做它。见regex101 sample
  • @ClasG 成功了,如果您将其发布为答案,我会接受它

标签: regex string scala split lexer


【解决方案1】:

这会给你一堆你的 EE 必须处理的空项目,但是添加单词边界 - \b - 应该可以做到。

检查example at regex101

...split('\s|\b')(或/\s|\b/)。

问候

【讨论】:

  • 如果我没记错的话,这会在结果中添加我认为不是预期的空格
【解决方案2】:

查看http://www.scala-lang.org/api/rc/index.html#scala.util.parsing.combinator.RegexParsers

这是一个未完成的例子:

import scala.util.parsing.combinator.RegexParsers

trait Element

case class Function(name: String,
                    params:Map[String, String],
                    expression:Seq[String]) extends Element

case class Class(name: String,
                 params: Map[String,String],
                 body: Seq[String]) extends Element

object LanguageParser extends RegexParsers {

  val name: Parser[String] = ".*".r

  val `type`: Parser[String] = ???

  val parameters: Parser[Map[String,String]] = "(" ~> (`type` ~ name).* <~")" ^^ {
    case t => (t map {
      case a ~ b => a -> b
    }).toMap
  }

  val expression: Parser[Seq[String]] = ???

  val function: Parser[Function] =
    "func " ~> name ~ parameters ~ "="~ expression ^^ {
      case name ~  params ~ _ ~ expr => Function(name, params, expr)
    }
  
  val `class`: Parser[Class] =
    "class " ~> name ~ parameters ~ "{" ~ expression ~ "}" ^^ {
      case name ~  params ~ _ ~ expr ~_ => Class(name, params, expr)
    }

  val topLevelParsers: Parser[Seq[Element]] =
    function |
      `class` |
      value |
      ifelse

  def parse(s: String): Seq[Element] = parseAll(topLevelParsers, s.trim) getOrElse
    (throw newIllegalArgumentException("Could not parse the given string: " + s.trim))

  def parseAll(s: String):Seq[Element] =
    s split ";" flatMap parse
}

干杯

【讨论】:

  • 现在 \b|\s 就足够了。但我担心我可能不得不重写我拥有的代码,并了解正则表达式解析器以实现更可靠的解决方案。感谢您的回复!
  • 您将立即节省学习时间。我第一次没有,因为我很懒,我不得不重写所有内容,并一直说为什么我以前不知道这个。
猜你喜欢
  • 2014-11-22
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
相关资源
最近更新 更多