我是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
的行感谢您的帮助。
答案 0 :(得分:1)
从没有GUID的行中获取IP地址...
String
拆分为行。// 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