regex 把一根绳子分成三块?

mnemlml8  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(104)

我有一个数字串。我需要把这些数字分组在长度为3的块中,并用一个破折号分隔。如果需要,最后一个块或最后两个块的长度可以是2。

String abc = "12-10 23 5555 8361";
    String hello = abc.replaceAll("[^a-zA-Z0-9]", "");

现在,我如何将它们分组为长度为3的块?
预期结果为

121-023-555-583-61
j2cgzkjk

j2cgzkjk1#

您也可以将三个数字分组,并替换为captured group和-

正则表达式:(\d{3})
**要进行的替换:**替换为\1-
Java程式码

String abc = "12-10 23 5555 8361";
String hello = abc.replaceAll("[^a-zA-Z0-9]", "");
System.out.println(hello.replaceAll("(\\d{3})", "$1-"));


o7jaxewo

o7jaxewo2#

您可以在基于lookbehind的正则表达式中使用\G

String abc = "12-10 23 5555 8361";
String hello = abc.replaceAll("[^a-zA-Z0-9]", "");
System.out.println(hello.replaceAll("(?<=\\G\\d{3})", "-"));
// => 121-023-555-583-61

请参阅IDEONE demo
(?<=\\G\\d{3})正则表达式只包含一个零宽度Assert,该Assert匹配字符串的开头或最后一个成功匹配(\G)的结尾,后跟3位数字(\d{3})。在Java正则表达式中,此模式在当前场景中工作正常(即\G从lookbehind中移动正则表达式索引)。但在Android中不起作用。

更新

对于更新的需求,您可以使用几个步骤的方法,如

public static void main (String[] args) throws java.lang.Exception
{
     String s = "0 - 22 1985--324"; // => 022-198-53-24
     run(s);
     s = "555372654";  // => 555-372-654
     run(s);
     s = "12-10 23 5555 8361"; // => 121-023-555-583-61
     run(s);
}
public static void run(String abc) {
    String hello = abc.replaceAll("[^a-zA-Z0-9]", "");
    hello = hello.replaceAll("(?<=\\G\\d{3})(?!$)", "-");
    System.out.println(hello.replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3"));
}

请参阅another IDEONE demo
正则表达式在字符串末尾的匹配失败的末尾更新为(?!$)
需要使用.replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3")来重新排列末尾的最后2个数字组:如果有3个或更多的数字后面跟有连字符,然后只有1个数字,我们需要将连字符移到前2个数字之后,并将其他数字移到该连字符之后。

相关问题