【问题标题】:Pattern matching using regex in Scala在 Scala 中使用正则表达式进行模式匹配
【发布时间】:2016-07-08 20:41:50
【问题描述】:

我有一个如下所示的数据集:-

192.10.678.234  192.12.898.123  public
192.10.567.6    3.3.3.3 public
192.20.123.39   123.34.31.678   private

我被困在如何使用模式匹配和正则表达式匹配三个字段 scala 在第二行中,“公共”字段在数据集中向左移动。

【问题讨论】:

标签: regex scala


【解决方案1】:

这是一个相当讨厌的正则表达式来处理它:(\d{1,3}(?:\.\d{1,3}){3})\s+(\d{1,3}(?:\.\d{1,3}){3})\s+(private|public)

使用kantan.regex,可以如下表达整个事情:

import kantan.regex.implicits._

// Where `input` is your string.
input.unsafeEvalRegex[(String, String, String)](rx"(\d{1,3}(?:\.\d{1,3}){3})\s+(\d{1,3}(?:\.\d{1,3}){3})\s+(private|public)")

这会产生一个Iterator[(String, String, String)],当运行通过foreach(println _) 时,会产生:

(192.10.678.234,192.12.898.123,public)
(192.10.567.6,3.3.3.3,public)
(192.20.123.39,123.34.31.678,private)

如果您对更好的类型感兴趣(例如,每个条目都有一个 Entry 类,以专用类型表示每个 IP 地址并具有 publicprivate 作为 ADT),请告诉我,我也可以修改代码来处理这个问题——kantan.regex 的重点是通过正则表达式从字符串中提取类型良好的数据。

【讨论】:

    【解决方案2】:

    see demo

    (?:(?:\d{1,3}\.){3}\d{1,3}\s*){2}([a-z]+)

    【讨论】:

    • 我需要三个不同的字段来匹配一行而不是你的情况下的两个字段
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多