遍历具有多行的字符串

7

我得到了一些数据:

def data = "# some useless text\n"+
        "# even more\n"+
        "finally interesting text"

我该如何获取其中的“有趣部分”?基本上所有行都不以#开头。
7个回答

14

一个不错的选择是Groovy:

def data = '''# some useless text
             |# even more
             |finally interesting text'''.stripMargin()

List lines = data.split( '\n' ).findAll { !it.startsWith( '#' ) }

assert lines == [ 'finally interesting text' ]

13
data.eachLine {
    if (!it.startsWith( '#' )
        println it
}

9

使用split方法获取子字符串,然后检查每个子字符串是否以“#”开头。

例如:

String[] splitData = data.split("\n");
for (String eachSplit : splitData) {
  if (!eachSplit.startWith("#")) {
    print(eachSplit);
  }
}

1

以下是使用Groovy的元编程特性(http://groovy.codehaus.org/JN3525-MetaClasses)的解决方案:

def data = "# some useless text\n"+
    "# even more\n"+
    "finally interesting text"

String.metaClass.collectLines = { it ->
    delegate.split('\n').findAll it
}

def result = data.collectLines{ !it.startsWith( '#' )}

assert result == ["finally interesting text"]

1

通过split函数,如何使用\n字符拆分字符串?

现在你可以通过String.startsWith("#")来测试每个字符串是否以#开头。


0

我会基于换行符 (\n) 来拆分字符串,然后忽略以 "#" 开头的行。

String[] lines = data.split("\n");
for (String line : lines) {
    if (line.startsWith("#") {
        continue;
    }
    //Do stuff with the important part
}

请注意,这是纯Java代码。

这将在字面上的"\n"处进行分割,而不是换行符\n - Peter Elliott

0
一个基于正则表达式的解决方案,不需要将输入字符串转换为列表,代码如下:
def data = '''\
# some useless text
# even more
finally interesting text'''

assert data.replaceAll(/#.*\n/, '') == 'finally interesting text'

如果你需要将输入分割成行,无论如何,你仍然可以使用正则表达式,如果你愿意的话,可以使用Collection#grep方法:
assert data.split('\n').grep(~/[^#].*/) == ['finally interesting text']

PS:正则表达式万岁!=P


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接