2017-02-27 40 views
0

某个字符的量更换数字是否有可能取代数字与某个字符像'X'使用正则表达式的量的String? (即替换"test3something8""testXXXsomethingXXXXXXXX")?在字符串使用正则表达式一行代码

我知道我可以使用for循环,但我正在寻找一种尽可能短的(正则表达式)单线解决方案(关于代码高尔夫挑战 - 是的,我意识到codegolf-SE,但这是一个普通的Java问题,而不是一个codegolf问题)。

  • 我知道如何与一个字符替换位数:
    String str = "test3something8".replaceAll("[1-9]", "X"); - >str = "testXsomethingX"
  • 我知道如何使用群体,如果你想使用的匹配,或每场比赛后添加的东西,而不是取代的它:
    String str = "test3something8".replaceAll("([1-9])", "$1X"); - >str = "test3Xsomething8X"
  • 我知道如何创建n量有一定的性格:
    int n = 5; String str = new String(new char[n]).replace('\0', 'X'); - >str = "XXXXX"
  • 或者是这样的:
    int n = 5; String str = String.format("%1$"+n+"s", "").replace(' ', 'X'); - >str = "XXXXX";

我想是这样的(以下明显的代码不能正常工作,但它应该给什么,我莫名其妙地想实现一个想法 - 最好甚至短了很多):

String str = "test3Xsomething8X" 
    .replaceAll("([1-9])", new String(new char[new Integer("$1")]).replace('\0', 'X'))); 
// Result I want it to have: str = "testXXXsomethingXXXXXXXX" 

正如我所说的,这上面不起作用,因为“$ 1”应该被直接使用,所以现在它给人一种

java.lang.NumberFormatException:对于输入字符串:“$ 1”


TL; DR:没有人知道一个班轮在某个字符的量替换字符串中的一个数字?

+1

我个人的暗示:不是一切需要定期来解决表达式。一种迹象表明你不会去正则表达式:当你需要其他人来构建它们时。重点是:它将成为你的代码,所以你是负责维护/增强它的人。 – GhostCat

+0

@GhostCat我知道,除了一些验证/格式化之外,我几乎在实际生产代码中使用正则表达式。但正如我在问题中提到的,这主要是针对代码高尔夫挑战(对于每个人的信息:代码高尔夫正在尽可能少的字节中解决一定的挑战)。对于硬编码或最终使用for循环来说,它可能会更短,但是当我正在进行挑战时,我主要感兴趣的是看到它甚至可以用一行代码替换具有某个特定字符的数字(因此这个问题)。它比实际使用更出于好奇。 –

+1

然后我会建议你在这里试试你的运气:http://codegolf.stackexchange.com/ – GhostCat

回答

0

如果你真的想把它作为一个单线。一个可能的解决方案(更多地将其视为PoC)可以使用Stream API。

String input = "test3something8"; 
input.chars() 
    .mapToObj(
     i -> i >= '0' && i <= '9' ? 
      new String(new char[i-'0']).replace('\0', 'X') 
      : "" + ((char)i) 
    ) 
    .forEach(System.out::print); 

输出

testXXXsomethingXXXXXXXX 

没有调查已经做了性能,可扩展性,是GC友好等

+0

如果数字大于9,那么怎么办? 'String input =“test30something18”; ' –

+0

@Nanangarsyad最初的请求是'替换**数字**在字符串'不是数字。我的答案仅仅是为了实现'有人知道一行'的要求。如果您想用相同数量的替换字符替换字符串中的数字,您应该寻找更适合您的问题的解决方案。如果SO上没有相关的答案可以解决您的问题,您可以提出一个新问题。 – SubOptimal

相关问题