从字符串中解析键/值对

时间:2013-05-23 22:44:22

标签: javascript regex scala

我正在从传入的电子邮件中解析正文,寻找键/值对。

电子邮件正文示例
名字:约翰 姓氏:史密斯 电子邮件:john@example.com
评论=只是一个测试评论 可能跨越多行。

我尝试在多行模式下使用RegEx ([\w\d\s]+)\s?[=|:]\s?(.+)。这适用于大多数电子邮件,但如果换行符应该是的一部分,则会失败。我对RegEx的了解还不够了。

我有另一个解析器逐行查找键/值对,如果找不到键/值对,只需将一行折叠成最后一个匹配的值。它是在Scala中实现的。

val lines = text.split("\\r?\\n").toList
var lastLabelled: Int = -1
val linesBuffer = mutable.ListBuffer[(String, String)]()

// only parse lines until the first blank line
// null_? method is checks for empty strings and nulls
lines.takeWhile(!_.null_?).foreach(line => {
  line.splitAt(delimiter) match {
    case Nil if line.nonEmpty => {
      val l = linesBuffer(lastLabelled)
      linesBuffer(lastLabelled) = (l._1, l._2 + "\n" + line)
    }
    case pair :: Nil => {
      lastLabelled = linesBuffer.length
      linesBuffer += pair
    }
    case _ => // skip this line
  }
})

我正在尝试使用RegEx,以便我可以将解析器保存到数据库并在运行时基于每个发件人进行更改(为不同的发件人实现不同的解析器)。

我的RegEx可以修改为匹配包含换行符的值吗? 我是否需要忘记使用RegEx并使用一些JavaScript?我已经有了一个JavaScript解析器,它允许我将JS存储在数据库中,并基本上执行我 想要 与RegEx解析器一起执行的所有操作。

1 个答案:

答案 0 :(得分:0)

我认为这应该有用......

((.+?)((\s*)(:|=)(\s*)))(((.|\n)(?!((.+?)(:|=))))+)

...在这里测试http://regexpal.com/。如果你遍历匹配,你应该能够提取密钥和值。