我正在尝试在字符串中的所有奇数之间放置-
。因此,如果字符串作为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
答案 0 :(得分:9)
从正则表达式中删除.*
以防止在一次匹配中使用所有字符。
此外,如果您想重复使用先前匹配的某些部分,则无法使用它。例如,如果您的字符串为135
并且您将匹配13
,那么您将无法在下次与3
的匹配中重复使用匹配的5
。
要解决此问题,请使用look-around zero-length机制,这意味着它们不会消耗它们匹配的部分。
所以描述有
的地方(?<=[13579])
后面,(?=[13579])
之后的奇数。所以你的代码看起来像
return str.replaceAll("(?<=[13579])(?=[13579])","-");
你也可以让正则表达式只消耗两个奇数中的一个来让其他一个被重用:
return str.replaceAll("[13579](?=[13579])","$0-");
return str.replaceAll("(?<=[13579])[13579]","-$0");