简单Groovy控制台解析问题

简单Groovy控制台解析问题,groovy,Groovy,我只是从Groovy开始。我肯定我错过了一些愚蠢的事情。有人能告诉我为什么这段代码在groovy控制台中失败吗?它认为输入字符串中只有14个单词和1行 def input = """ line1: 50 65 42 line2: 123 456 352 753 1825 line3: 10 25 20 48 107 """ words = input.split(/ /) lines = input.split(/^/) assert words.size() == 16 assert lin

我只是从Groovy开始。我肯定我错过了一些愚蠢的事情。有人能告诉我为什么这段代码在groovy控制台中失败吗?它认为输入字符串中只有14个单词和1行

def input = """
line1: 50 65 42
line2: 123 456 352 753 1825
line3: 10 25 20 48 107
"""

words = input.split(/ /)
lines = input.split(/^/)
assert words.size() == 16
assert lines.size() == 3

对于第一个
断言
,错误消息可能会提示问题所在:

断言失败:
断言单词。大小()==16
|     |      |
|14错误
[
第1行:,50,65,42
第2行:、123、456、352、753、1825
第3行:,10,25,20,48,107
]
此处缺少一些逗号,
单词
值的打印方式似乎是错误的。发生的情况是,
input.split(//)
将输入字符串按空格分割,但是,由于它还包含换行符,一些单词不会被分割,例如,
'42\nline2:'

为了更清楚地了解这一点,我们可以使用该方法,该方法为我们提供一个具有对象的文本形式的字符串:

println input.inspect()
// --> '\nline1: 50 65 42\nline2: 123 456 352 753 1825\nline3: 10 25 20 48 107\n'

println input.split(/ /).inspect()
// --> ['\nline1:', '50', '65', '42\nline2:', '123', '456', '352', '753', '1825\nline3:', '10', '25', '20', '48', '107\n']
Groovy添加了一种方便的非参数化方法,用于按空格拆分单词:

要获得字符串的行,可以使用

但是请注意,
readLines
将返回四个元素,因为有第一个空行(我不知道为什么它会忽略最后一个空行),所以
assert lines.size()==3
仍然会失败

您可以使用结果列表中的或直接调用输入字符串过滤掉这些空行:

def lines = input.readLines().findAll()
assert lines.size() == 3

def lines2 = input.findAll(/\S+/)
assert lines2.size() == 3

assert lines == lines2

对于第一个
断言
,错误消息可能会提示问题所在:

断言失败:
断言单词。大小()==16
|     |      |
|14错误
[
第1行:,50,65,42
第2行:、123、456、352、753、1825
第3行:,10,25,20,48,107
]
此处缺少一些逗号,
单词
值的打印方式似乎是错误的。发生的情况是,
input.split(//)
将输入字符串按空格分割,但是,由于它还包含换行符,一些单词不会被分割,例如,
'42\nline2:'

为了更清楚地了解这一点,我们可以使用该方法,该方法为我们提供一个具有对象的文本形式的字符串:

println input.inspect()
// --> '\nline1: 50 65 42\nline2: 123 456 352 753 1825\nline3: 10 25 20 48 107\n'

println input.split(/ /).inspect()
// --> ['\nline1:', '50', '65', '42\nline2:', '123', '456', '352', '753', '1825\nline3:', '10', '25', '20', '48', '107\n']
Groovy添加了一种方便的非参数化方法,用于按空格拆分单词:

要获得字符串的行,可以使用

但是请注意,
readLines
将返回四个元素,因为有第一个空行(我不知道为什么它会忽略最后一个空行),所以
assert lines.size()==3
仍然会失败

您可以使用结果列表中的或直接调用输入字符串过滤掉这些空行:

def lines = input.readLines().findAll()
assert lines.size() == 3

def lines2 = input.findAll(/\S+/)
assert lines2.size() == 3

assert lines == lines2

很好的解释。非常感谢。我原以为我的问题更多的是我的正则表达式,而不是其他任何东西。很好的解释。非常感谢。我原以为我的问题更多的是我的正则表达式,而不是其他任何东西。