代码之家  ›  专栏  ›  技术社区  ›  fastcodejava

字符串替换问题

  •  1
  • fastcodejava  · 技术社区  · 15 年前

    我想为我正在开发的代码生成器提供一些模板。班级的典型模式是:

    public ${class_type} ${class_name} extends ${super_class} implements ${interfaces} {
    
    ${class_body}
    
    }
    

    问题是超级类是空的还是接口。我将扩展${super\u class}替换为空字符串。但我有多余的空间。所以一个没有超级类和接口的类最终会变成:

    public class Foo    {  //see the extra spaces before {?
    
    ${class_body}
    
    }
    

    我知道我可以用一个空格代替多个空格,但有没有更好的方法?

    编辑: 我收到了一些很好的答复,但它没有解决这个问题。我无法指定模板,用户将设置它。否则,有什么意义?如果他们想拥有:

    public ${class_type} ${class_name} extends ${super_class} 
                                       implements ${interfaces} {
    
    ${class_body}
    
    }
    

    我想我总是可以删除所有空格之间 extends ${super_class} implements ${interfaces} 当其中一个为空时。它仍然不是完美的,但会更好。

    6 回复  |  直到 15 年前
        1
  •  0
  •   javaguy    15 年前

    一个好的方法是写一个空字符串的关键字,然后把空格占到下一个关键字。方法签名为:

    void blankKeyword(String content, String keyword, String next);
    

    写起来应该不会太难。

        2
  •  2
  •   Amir Rachum    15 年前

    在字符串“extends${super\u class}”等中包含前面的空格,这样当您插入一个空字符串时,它根本不会产生空格。

        3
  •  2
  •   Community CDub    8 年前

    两种选择:

    一个 :更改模板:

    public ${class_type} ${class_name}${super_block}${interfaces_block} {
    ${class_body}
    }
    

    ${super_block} ${interfaces_block}

    两个 :进行替换时,请确保在前面留出空间(编辑:as Amir suggested

    (旁注:引用的模板在打开前的接口位后面有两个空格 { ,这是问题的根源。)

        4
  •  1
  •   polygenelubricants    15 年前

    _extends_${super_class} _implements_${interfaces}

    ...${class_name}_extends_${super_class}_implements_${interfaces}_{
                    \_____________________/\_______________________/
                        optional               optional
    

    思考问题的一种方法是考虑空间是什么:定界符。类似地,你的问题是这样的:

    A , B ,和 C B 是可选的。您想将它们列为元组,即用 ( ) , . 也就是说,这些都是有效的元组:

    (A,B,C)
    (A,B)
    (A,C)
    (A)
    

    现在更明显的是,您可以将前面的逗号附加到 B C (A + ,B + ,C + ) ,中间的两个是可选的--这样就不会得到任何额外的分隔符。


    注意:出于简化代码生成的原因,有些语法允许在可变长度列表(如句子)的末尾添加逗号。例如,在Java中,这是一个有效的数组初始值设定项:

    int[] arr = new int[] { 1, 2, }
                                ^
                               perfectly okay!
    

    对于这类语法,在每个部分后面附加分隔符更有意义。您可以使代码生成更加复杂,这样就永远不会产生尾随逗号(可能是因为您不喜欢看到逗号),但事实上,许多语法确实允许使用这种简化的“快捷方式”。

        5
  •  0
  •   Karussell    15 年前

    如果你想要一个更强大的解决方案,你可以使用 an existing template engine 喜欢 velocity freemarker

        6
  •  0
  •   NomeN    15 年前

    public ${class_type} ${class_name} [extends ${super_class} ][implements ${interfaces} ]{
        ${class_body}
    }
    

    因此,如果用户没有指定继承关系,我甚至不包括空格,而不是删除空格。