发现Groovy

时间:2016-01-27 00:06:04

标签: regex groovy

我是Groovy编码的新手( 我有持有IP地址和GUID的叮咬。有时GUID是空的。

For example: 
139.14.8.162    b38e34ab-32ad-46b3-961c-17762c1c2957
139.268.15.201

如何在Groovy中我可以从GUID不存在的行获取IP地址?在我的例子中,我需要跳过139.14.8.162获取139.268.15.201

的行

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

从没有GUID的行中获取IP地址...

  1. String拆分为行。
  2. 使用正则表达式查找仅具有IP
  3. 的行

    示例代码

    // Sample data
    def data = '''139.14.8.162    b38e34ab-32ad-46b3-961c-17762c1c2957
    139.268.15.201
    139.269.14.201
    139.15.9.162    961c-32ad-46b3-961c-17762c1c2957'''
    
    def ipAddresses = data.split(/\n/).findAll { it ==~ /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/ }
    
    // Assertion showing it works.
    assert ipAddresses == ['139.268.15.201', '139.269.14.201']
    

    如何运作

    首先,data.split(/\n/)返回List,其中包含String中的每一行。最后,findAll { it ==~ /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/ }遍历List并返回与正则表达式匹配的所有条目。

答案 1 :(得分:1)

def data = '''139.14.8.162    b38e34ab-32ad-46b3-961c-17762c1c2957
139.268.15.20
139.269.14.201
139.15.9.162    961c-32ad-46b3-961c-17762c1c2957'''

// Poor man's solution if you are sure that you would get IPv4 strings
data.readLines().findAll { it.trim().size() <= 15 }

// A little explicit from above solution
data.readLines().findAll { it.tokenize(/./)[3].trim().size() <= 3 }

// Extensions to previous answers
data.readLines()*.split().findResults { it.size() == 1 ? it[0] : null }

// BDKosher's approach using readLines()
data.readLines()*.split().findAll { it.size() == 1 }.flatten()

// UPDATE: And yes I totally missed JDK 8 Stream implementation
data.readLines()
    .stream()
    .filter { it.trim().size() <= 15 }
    .map { it.trim() }
    .collect()

根据答案的频率,您可以想象有多种方法可以在Groovy中找到问题的解决方案。由此得名。 :)

我很确定你会喜欢这个旅程。

答案 2 :(得分:0)

您不一定需要正则表达式来解析内容。

如果拆分配置的每一行,它应该生成带有一个或两个元素的数组:一个元素数组用于只有IP的行,如果该行同时具有IP和GUID,则为两个元素数组。

然后这只是抓住单元素阵列。

data.split(/\n/)                       // convert String into List of Strings (if needed)
    .collect { line -> line.split() }  // transform each line into an array
    .findAll { it.size() == 1 }        // select the lines that only had IPs
    .flatten()                         // flatten each 1-element array to get a list of IPs