如何在Java中的三行中创建一行?

时间:2015-10-21 13:17:37

标签: java format substring row

我有一个css文件,其中包含以下类型的文字:

:

我希望格式化文本,以便返回类似的内容:

.fa-glass:before {
 content: "\f000";
}
.fa-music:before {
 content: "\f001";
}
.fa-search:before {
content: "\f002";
}

我做了一些研究并在SO上找到了很多代码并尝试了以下

GLASS(f000),
MUSIC(f001),
SEARCH(f0002)

得到了这个结果:

   String result = cssFile.substring(cssFile.indexOf("-") + 1, cssFile.indexOf(":b") +1);

我既不想要名字后面的“:”,也不想要空行。我知道为什么它会像这样回归。这是因为在源文件中{}内的文本和括号本身在3行中展开。因为当我删除+1时我得到异常:字符串索引超出范围:-1。 有没有办法用java将第二个大括号和大括号内的文本移动到第一行?我不想手动操作,因为有更多的tan 1000条目。 感谢

3 个答案:

答案 0 :(得分:1)

问题是,当该行不包含字符" - "时,您的表达式不匹配也不是角色":"。

那是空行的情况:

  • .fa-glass:before {:包含":"和" - "所以它产生:glass:
  • content: "\f000";不包含":"所以你的代码产生一个空字符串(cssFile.substring(0, 0)=""

等等。

我编写了一个简单的测试代码,可以执行您想要的操作:

@Test
public void testConcat() throws Exception {

    /*
     * String that simulates a file with this content:
     * .fa-glass:before {
     *    content: "\f000";
     * }
     * .fa-music:before {
     *    content: "\f001";
     * }
     * .fa-search:before {
     *    content: "\f002";
     * }
     */
    String cssFile = ".fa-glass:before {\n content: \"\\f000\";\n}\n.fa-music:before {\n content: \"\\f001\";\n}\n.fa-search:before {\ncontent: \"\\f002\";}";

    BufferedReader br = new BufferedReader(new StringReader(cssFile));

    String line = null;
    String name = null;
    String value = null;
    StringBuilder result = new StringBuilder();
    while( (line = br.readLine()) != null) {
        if(line.contains(".fa-")) {
            name = line.substring(line.indexOf(".fa-") + 4, line.indexOf(":")).toUpperCase();
        } else if(line.contains(";")){
            value = line.substring(line.indexOf(": \"") + 3, line.lastIndexOf("\""));
            result.append(String.format("%s(%s)\n", name, value));
        }
    }

    /*
     * It will print:
     * GLASS(\f000)
     * MUSIC(\f001)
     * SEARCH(\f002)
     */
    System.out.println(result.toString());

    assertThat(result.toString()).isEqualTo("GLASS(\\f000)\nMUSIC(\\f001)\nSEARCH(\\f002)\n");
}

答案 1 :(得分:1)

以下代码实现了相同的目标。代码不是最佳的,因为我需要赶时间。请通过使用Stringbuffers以及任何适用的地方进行优化。

File f=new File("test.css");
        BufferedReader br=new BufferedReader(new FileReader(f));
        String ln;
        StringBuffer sb=new StringBuffer();
        while((ln=br.readLine())!=null){
            sb.append(ln);
        }
        String[] sections=sb.toString().split("}");
        for(String st:sections){
            String temp=st.substring(st.indexOf("-")+1, st.indexOf(":")).toUpperCase()+"("+st.substring(st.indexOf("\\")+1, st.indexOf("\";"))+")";
            System.out.println(temp);
        }

输出:

GLASS(F000)
MUSIC(F001)
SEARCH(F002)

答案 2 :(得分:0)

如果您有notepad ++(或任何文本编辑器可以"替换所有"基于模式 - 我已经使用了notepad ++和为此选择的扩展'搜索模式 - 你可以很快地做出改变。

第一次找到{\ r \ n,用空字符串替换。 第二次,找到\ r \ n},替换为空字符串。

最终结果是

.fa-glass:before  content: "\f000";
.fa-music:before  content: "\f001";
.fa-search:before content: "\f002";

如果您希望保留花括号,则只需更改'替换为'更换期间的部分