Java:根据正则表达式的值更改var的值(String)

时间:2011-12-19 15:20:12

标签: java regex string

我想知道是否有可能(如果可能的话,我如何实现它)使用一个正则表达式来操作String值(Java)。

例如:

String content = "111122223333";
String regex = "?";

预期结果:"1111 2222 3333 ##";

2 个答案:

答案 0 :(得分:2)

仅使用一个正则表达式,我认为不可能。但你可以:

  • 首先,用空格替换(?<=(.))(?!\1);
  • 然后,使用字符串append追加“##”。

即:

Pattern p = Pattern.compile("(?<=(.))(?!\\1)");

String ret = p.matcher(input).replaceAll(" ") + " ##";

如果你的意思是分开所有组,那么放弃第二个操作。

说明:(?<=...)是一个积极的外观,(?!...)是一个负面的预测。在这里,您要告诉您要找到一个位置,其中有一个角色落后,被捕获,并且相同的角色应该跟随。如果是这样,请用空格替换。 Lookaheads和lookbehinds是锚点,就像所有锚点(包括^$\A等)一样,它们不会消耗字符,这就是它起作用的原因。

答案 1 :(得分:0)

好的,因为OP已经重新定义了问题(即,一组12个数字应该分成3组,每组4个,然后是##,解决方案就变成了这个:

Pattern p = Pattern.compile("(?<=\\d)(?=(?:\\d{4})+$)");

String ret = p.matcher(input).replaceAll(" ") + " ##";

正则表达式发生了很大变化:

  • (?<=\d):后面应该有一位数字;
  • (?=(?:\d{4})+$):之后应该有一个或多个4位数的组,直到行尾((?:...)是非捕获分组 - 不确定它是否真的对Java产生影响)

验证输入长度为12位可以使用完全不与正则表达式相关的方法轻松完成。事实上,这种验证是必要的:不幸的是,这个正则表达式也会将12345转换为1 2345,但是没有办法解决这个问题,因为lookbehinds无法匹配任意长度的正则表达式......除了.NET语言。有了他们,你可以写下:

(?<=^(?:\d{4})+)(?=(?:\d{4})+$