如何有效地解析(没有太多代码混乱)语句,如下所示?关键字/分隔符放在 [] 内。
德里经理 [for] The Company Pvt Ltd. [从] 2009 年 1 月 [至] 2012 年 1 月。
将使用解析组合器从文本中提取人名、公司名称和日期范围。(预期输出显示在底部)
以下是为上述内容编写的代码 -
case class CompanyWithMonthDateRange(company:String, position:String, dateRange:List[MonthYear])
case class MonthYear(month:String, year:Int)
object CompanyParser1 extends RegexParsers {
override type Elem = Char
override def skipWhitespace = false
def keywords: Parser[String] = "for" | "in" | "with" |"at" | "from" | "pvt"|"ltd" | "company" | "co" | "limited" | "inc" | "corporation" | "jan" |\
"feb" | "mar" | "apr" | "may" | "jun" | "jul" | "aug" | "sep" | "nov" | "dec" | "to" | "till" | "until" | "upto"
val date = ("""\d\d\d\d""".r | """\d\d""".r)
val integer = ("""(0|[1-9]\d*)""".r) ^^ { _.toInt }
val comma = ("""\,""".r)
val quote = ("""[\'\"]+""".r)
val underscore = ("""\_""".r)
val dot = ("""\.""".r)
val space = ("""\s+""".r) ^^ {case _ => ""}
val colon = (""":""".r)
val ampersand = ("""(\&|and)""".r)
val hyphen = ("""\-""".r)
val brackets = ("""[\(\)]+""".r)
val newline = ("""[\n\r]""".r)
val months = ("""(jan|feb|mar|apr|may|jun|jul|aug|sep|nov|dec)""".r)
val toTillUntil = ("""(to|till|until|upto)""".r)
val asWord = ("""(as)""".r)
val fromWord = ("""from""".r)
val forWithAt = ("""(in|for|with|at)""".r)
val companyExt = ("""(pvt|ltd|company|co|limited|inc|corporation)""".r)
val alphabets = not(keywords)~"""[a-zA-Z]+""".r
val name = not(keywords)~"""[a-zA-Z][a-zA-Z\,\-\'\&\(\)]+\s+""".r
def possibleCompanyExts = companyExt <~ (dot *) ^^ {_.toString.trim}
def alphabetsExt = ((alphabets ~ ((quote | ampersand | hyphen | brackets | underscore | comma) *) <~ (space *))+) ^^ { case a => a.toString.trim}
def companyNameExt = (alphabetsExt <~ (space *) <~ (possibleCompanyExts+)) ^^ {_.toString
}
def companyName = alphabetsExt *
def entityName = (alphabetsExt+) ^^ {case l => l.map(s => s.trim).mkString(" ")}
def dateWithEndingChars = date <~ ((comma | quote | dot | newline) *) <~ (space *) ^^ {_.toInt}
def monthWithEndingChars = months <~ ((comma | quote | dot | newline) *) <~ (space *) ^^ { _.toString}
def monthWithDate = monthWithEndingChars ~ dateWithEndingChars ^^ { case a~b => MonthYear(a,b)}
def monthDateRange = monthWithDate ~ (space *) ~ toTillUntil ~ (space *) ~ monthWithDate ^^ { case a~s1~b~s2~c => List(a,c)}
def companyWithMonthDateRange = (companyNameExt ~ (space *) ~ monthDateRange) ^^ {
case a~b~c => CompanyWithMonthDateRange(company = a, dateRange = c, position = "")
}
def positionWithCompanyWithMonthDateRange = ((name+) ~ (space *) ~ forWithAt ~ (space *) ~ companyWithMonthDateRange) ^^ {
case a~s1~b~s2~c => c.copy(position = a.mkString(","))
}
def apply(input:String) = {
parseAll(positionWithCompanyWithMonthDateRange,input) match {
case Success(lup,_) => println(lup)
case x => println(x)
}
}
}
输出应该类似于
CompanyWithMonthDateRange(List(((()~Company)~List()), ((()~fd)~List()), ((()~India)~List('))),(()~Manager, ),(()~Delhi ),List(MonthYear(mar,2010), MonthYear(jul,2012)))
另外,如何删除上面文本中出现的不需要的“~”。
谢谢,帕万