Java使用正则表达式在字符串中的奇数之间放置一个" - "

Hel*_*123 6 java regex string

我试图-在字符串中的所有奇数之间放置一个.因此,如果传入一个字符串,Hel776o它应该输出Hel7-76o.破折号应仅放在两个连续的奇数之间.

我试图通过String.replaceAll()在一行中执行此操作

我有以下几行:

return str.replaceAll(".*([13579])([13579]).*","$1-$2");
Run Code Online (Sandbox Code Playgroud)

如果有任何奇数,后跟一个奇数,则-在它们之间放置一个.但它破坏性地取代了除了最后一场比赛之外的一切.

例如,如果我传入"999477"它将输出7-7而不是9-9-947-7.是否需要更多分组,所以除了比赛之外,我不会更换所有内容?

我已经通过传统的循环遍历字符串中的每个字符串,但希望在带有正则表达式替换的单行中执行此操作.

编辑:我应该说我的意思return str.replaceAll(".*([13579])([13579]).*","$0-$1");而不是$1$2

Psh*_*emo 9

.*从正则表达式中删除以防止在一次匹配中消耗所有字符.

此外,如果您想重用之前匹配的某些部分,则无法使用它.例如,如果您的字符串将是135并且您将匹配,则13您将无法3在下次匹配时再次使用匹配的字符串5.
要解决这个问题,请使用零长度的环视机制,这意味着它们不会消耗它们匹配的部分.

所以描述有的地方

  • 使用前的奇数看后面(?<=[13579]),
  • 使用前瞻后的奇数(?=[13579]).

所以你的代码看起来像

return str.replaceAll("(?<=[13579])(?=[13579])","-");
Run Code Online (Sandbox Code Playgroud)

你也可以让正则表达式只消耗两个奇数中的一个来让其他一个被重用:

return str.replaceAll("[13579](?=[13579])","$0-");

return str.replaceAll("(?<=[13579])[13579]","-$0");
Run Code Online (Sandbox Code Playgroud)