我想知道是否有可能(如果可能的话,我如何实现它)使用一个正则表达式来操作String值(Java)。
例如:
String content = "111122223333";
String regex = "?";
预期结果:"1111 2222 3333 ##";
答案 0 :(得分:2)
仅使用一个正则表达式,我认为不可能。但你可以:
(?<=(.))(?!\1)
; 即:
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})+$