Java 字符串替换问题

Java 字符串替换问题,java,string,Java,String,我想为我正在开发的代码生成器提供一些模板。类的典型模式是: public ${class_type} ${class_name} extends ${super_class} implements ${interfaces} { ${class_body} } 问题是super_类是空的还是接口。我将扩展${super_class}替换为空字符串。但我有额外的空间。因此,一个没有super_类和接口的类的结果如下: public class Foo { //see the extr

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

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

${class_body}

}
问题是super_类是空的还是接口。我将扩展${super_class}替换为空字符串。但我有额外的空间。因此,一个没有super_类和接口的类的结果如下:

public class Foo    {  //see the extra spaces before {?

${class_body}

}
我知道我可以用单个空格替换多个空格,但有没有更好的方法

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

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

${class_body}

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

在字符串extends${super\u class}等中包含前面的空格,因此在插入空字符串时,它根本不会产生空格


编辑:显然,除了上述修复之外,还应该删除字符串之间的空格。

在字符串extends${super_class}等中包含前面的空格,因此在插入空字符串时,它根本不会产生空格

编辑:显然,除了上述修复之外,您还应该删除字符串之间的空格。

两个选项:

第一:更改模板:

public ${class_type} ${class_name}${super_block}${interfaces_block} {
${class_body}
}
…并始终将${super_block}和${interfaces_block}替换为extends超类,注意前面的空格,但不要在末尾,或者使用空白字符串。类似地,interfaces块将是implements Foo[前面的空格]或blank

第二:在进行替换编辑时,请确保前面有空格。但当您处理多个块(如超级和接口)时,这将变得棘手

旁注:引用的模板在开头{之前的接口位后面有两个空格,这是问题的原因。

两个选项:

第一:更改模板:

public ${class_type} ${class_name}${super_block}${interfaces_block} {
${class_body}
}
…并始终将${super_block}和${interfaces_block}替换为扩展超类注意前面的空格,但不在末尾,或者替换为空白字符串。类似地,interfaces块将是implements Foo[前面的空格]或空白

第二:在进行替换编辑时,请确保在前面包含空格:as。但是,在处理超级和接口等多个块时,这将变得很棘手


旁注:引用的模板在开始{之前的接口位后面有两个空格,这是问题的原因。

只需在替换模式中包含前面的空格,即{u extends{super\u class}和{u implements{interfaces}可以替换为空字符串,我使用下划线使其更显式

...${class_name}_extends_${super_class}_implements_${interfaces}_{
                \_____________________/\_______________________/
                    optional               optional
思考这个问题的一种方法是把空间看成是一个定界符。类似地,你的问题是这样的:

可以按该顺序显示A、B和C,但B和C是可选的。您希望将它们列为元组,即以和包围,以分隔。也就是说,这些都是有效的元组:

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

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

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

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

只需在替换模式中包含前面的空格,即_extensions${super_class}和_implements${interfaces}可以替换为空字符串,我使用下划线使其更显式

...${class_name}_extends_${super_class}_implements_${interfaces}_{
                \_____________________/\_______________________/
                    optional               optional
思考这个问题的一种方法是把空间看成是一个定界符。类似地,你的问题是这样的:

可以按该顺序显示A、B和C,但B和C是可选的。您希望将它们列为元组,即以和包围,以分隔。也就是说,这些都是有效的元组:

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

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

int[] arr = new int[] { 1, 2, }
                            ^
                           perfectly okay!
对于这类语法,
在每个部分后面附加分隔符更有意义。您可以使代码生成更加复杂,这样它就不会产生尾随逗号,可能是因为您不喜欢看到逗号,但事实上,许多语法确实允许它们在某种程度上证明了使用这种简化快捷方式的合理性。

如果您想要更强大的解决方案,可以使用like or。

如果您想要更强大的解决方案,可以使用like or。

我想添加一些表示选项的方法:

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

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

我会添加一些表示选项的方法:

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

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

一个好方法是编写一个空格,用空字符串清空一个关键字,并将空格一直占到下一个关键字。方法签名将是:

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

写起来应该不会太难。

一个好方法是写一个空格,用空字符串清空一个关键字,并将空格一直占到下一个关键字。方法签名将是:

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

写起来应该不会太难。

这不正是埃米尔几分钟前说的吗?我的互联网速度慢且不可靠,我能做什么。你应该看到有一次我不小心贴了三个答案。。。这些都有相同的打字错误。这不正是埃米尔几分钟前说的吗?我的互联网速度慢且不可靠,我能做什么。你应该看到有一次我不小心贴了三个答案。。。它们都有相同的打字错误。如果您提供处理此问题的代码生成器的代码,您的问题可能会更清楚。如果您提供处理此问题的代码生成器的代码,您的问题可能会更清楚。