我有以下数据
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个空格时,这个正则表达式并没有停止。不知道如何修改它以适合我的数据。
所有的帮助表示赞赏。 感谢
答案 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)