【问题标题】:Iterate through String with multiple lines用多行遍历字符串
【发布时间】:2013-01-05 03:14:24
【问题描述】:

我得到了一些数据:

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

我怎样才能得到其中“有趣的部分”?所以基本上所有的行,不以#开头。

【问题讨论】:

    标签: java string groovy loops


    【解决方案1】:

    如何通过split function用\n字符分割字符串

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

    【讨论】:

      【解决方案2】:

      我会根据换行符 (\n) 拆分字符串,然后忽略以“#”开头的行。

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

      请注意,这是纯 Java。

      【讨论】:

      • 这将拆分文字 "\n",而不是换行符 \n
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        一个 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' ]
        

        【讨论】:

          【解决方案5】:

          不需要将输入字符串转换为列表的基于正则表达式的解决方案是:

          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:正则表达式 FTW! =P

          【讨论】:

            【解决方案6】:

            这是使用 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"]
            

            【讨论】:

              【解决方案7】:
              data.eachLine {
                  if (!it.startsWith( '#' )
                      println it
              }
              

              【讨论】:

                猜你喜欢
                • 2010-12-02
                • 2011-03-04
                • 2011-05-13
                • 2018-05-15
                • 2010-10-10
                相关资源
                最近更新 更多