规范化嵌入数字的字符串

时间:2018-01-12 01:40:29

标签: java regex

我有许多文件夹(200+),这些文件夹的格式是用数字混合的字符,例如:

california1
california2_scenes
california11
california12_people
utah8
utah3_tounament

命名遵循以下约定:

  • 以字符串开头
  • 后跟1或2位数字
  • 可选择后跟下划线和其他字符(此时无数字)

我正在编写一个Java命令工具,通过零填充

以更统一的方式重命名它们
california01
california02_scenes
california11
california12_people
utah08
utah03_tounament

我尝试使用正则表达式搜索单个数字并替换:

name.replaceAll("(\\d)", "\\1");

由于以下几个原因,上述方法无效:

  1. 该模式匹配1位和2位数字。我只想匹配一个数字
  2. Java不理解\\1代表第一个匹配组的符号。
  3. 我也尝试使用直接替换来解决这个问题:

    name = name.replaceAll("1_", "01_"). ... .replaceAll("9_", "09_");
    

    此方法同样不区分单位和双位数字,并且对于单个数字位于字符串末尾的情况不起作用。

    我感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

    String[] as = { "california1", "california2_scenes", "california11", "california12_people", "utah8",
            "utah3_tounament" };
    for (String s : as) {
        //no number behind, number, no number ahead
        String sp = "(?<!\\d)\\d(?!\\d)";
        Pattern p = Pattern.compile(sp);
        System.out.println(s);
        System.out.println(s.replaceAll(sp, "0$0"));
    }

输出:

california1
california01
california2_scenes
california02_scenes
california11
california11
california12_people
california12_people
utah8
utah08
utah3_tounament
utah03_tounament