2011-12-19 40 views

回答

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})+$

+0

与你的第一个答案一样,后顾是一种无理的复杂性。正如你所说,*验证*字符串属于一个单独的步骤。完成之后,您可以简单地用'“$ 1”替换所有的''\\ d {4}'''并且粘贴'##'。 – 2011-12-19 19:47:26

+0

是的,的确如此,而且速度更快。 – fge 2011-12-19 19:57:03

+0

谢谢,解决了我的问题:) – Orlandols 2011-12-20 10:42:48

2

随着一个正则表达式而已,我不认为这是可能的。但您可以:

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

即:

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

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

如果你的意思是为了把所有的组,然后删除第二个操作。

说明:(?<=...)是一个积极向后看,而(?!...)负面看。在这里,您要告诉您想要找到一个位置,在该位置后面有一个字符,该位置被捕获,并且相同字符应该跟随而不是。如果是这样,请用空格替换。 lookaheads和lookbehinds是主播,并且和所有主播一样(包括^$\A等),它们不会消耗字符,这就是它工作的原因。

+0

相当聪明! (和很好的解释)+1 – ridgerunner 2011-12-19 16:25:40

+0

首先,感谢您提供的解决方案。但我提出的例子并不是最好的例子。我真正想要的是用一个新字符串中的12位数字符串进行转换,每个字符由3组4位数字组成(dddd dddd dddd),并以##结尾,如“dddd dddd dddd ##” – Orlandols 2011-12-19 18:34:04

+0

@ user1106161 OK ,请参阅补充内容 – fge 2011-12-19 18:53:19