我试图在字符串中的所有奇数之间放置一个-。因此,如果一个字符串作为Hel776o传入,它应该输出Hel7-76o。破折号只能放在两个连续的奇数之间。
我正试图通过String.replaceAll()在一行中实现这一点。
我有以下几句话:
return str.replaceAll(".*([13579])([13579]).*","$1-$2");如果有奇数,后面跟着奇数,则在它们之间放置一个-。但除了最后一场比赛外,这一切都是破坏性的。
如果我通过"999477",它将输出7-7而不是9-9-947-7。是否需要更多的分组,这样我就不会替换除了比赛之外的所有东西吗?
我已经通过字符串中的每个字符执行了一个传统的循环,但是我想用正则表达式替换一个一行。
编辑:我应该说我指的是return str.replaceAll(".*([13579])([13579]).*","$0-$1");,而不是$1和$2
发布于 2015-07-24 20:46:23
从正则表达式中删除.*,以防止在一次匹配中消耗所有字符。
另外,如果您想重用以前匹配的某些部分,就不能使用它。例如,如果您的字符串为135,并且您将匹配13,那么您将无法在下一次与5的匹配中重用匹配的3。
为了解决这个问题,请使用环顾四周机制,它是零长,这意味着它们不会消耗它们匹配的部分。
所以来描述一下有
(?<=[13579])后面,(?=[13579])。所以你的代码看起来就像
return str.replaceAll("(?<=[13579])(?=[13579])","-");还可以让regex只使用两个奇数中的一个来重用另一个奇数:
return str.replaceAll("[13579](?=[13579])","$0-");
return str.replaceAll("(?<=[13579])[13579]","-$0");https://stackoverflow.com/questions/31619444
复制相似问题