scala正则表达式以双倍空间限制

时间:2016-12-23 08:46:07

标签: regex scala

我有以下数据

grep -E '^[[:digit:]]+,'

我想提取id schoolname城区。

模式是id(数字),后跟单个空格,然后是学校名称。 name可以有多个单词空格分割,也可以有特殊字符。然后最小的双倍空间或更多的城市。城市可能有多个单词分割空间或可能有特殊的字符。然后至少2个空格或更多的区域。甚至区域也遵循与学校名称相同的属性。市。但该区域可能存在也可能不存在。如果不是那么我想要区域的空值。

这是我试过的正则表达式。

135 stjosephhrsecschool             london  DunAve
175865 stbele_higher_secondary sch  New York     
11 st marys high school for women   Paris  Louis Avenue 

但是当它看到超过2个空格时,这个正则表达式并没有停止。不知道如何修改它以适合我的数据。

所有的帮助表示赞赏。 感谢

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题 - 问题是结果组包含尾随空格(例如"Louis Avenue ")。如果是这样 - 您可以使用非贪婪修饰符(例如+?*?来解决此问题:

([\d]+) ([\w\s\S]+?)\s\s+([\w\s\S]+?)\s\s+([\w\s\S]*?)?\s*

这导致了所需的输出:

val s1 = "135 stjosephhrsecschool             london  DunAve"
val s2 = "175865 stbele_higher_secondary sch  New York     "
val s3 = "11 st marys high school for women   Paris  Louis Avenue "

val r = """([\d]+) ([\w\s\S]+?)\s\s+([\w\s\S]+?)\s\s+([\w\s\S]*?)?\s*""".r

def matching(s: String) = s match {
  case r(a,b,c,d) => println((a,b,c,d))
  case _ => println("no match")
}

matching(s1) // (135,stjosephhrsecschool,london,DunAve)
matching(s2) // (175865,stbele_higher_secondary sch,New York,)
matching(s3) // (11,st marys high school for women,Paris,Louis Avenue)