java正则捕获替换

比如这么一行字符串

3 "Freisasse" 500 "privileges/ps_03_freisasse.lua" 2 2 150
|

我想改变成

3 "Freisasse" 50000 "privileges/ps_03_freisasse.lua" 2 2 150
|

也即第三个数字X100,请问怎么写?

谢谢,网上找到的例子都是简单的全部替换,这里面很多数字只要替换一个就行了。

源文本
1 "Unfreier" 0 "" 0 0 0 |
2 "Gemeiner" 250 "privileges/ps_02_gemeiner.lua" 1 1 0 |
3 "Freisasse" 500 "privileges/ps_03_freisasse.lua" 2 2 0 |
4 "Beisasse" 2000 "privileges/ps_04_beisasse.lua" 2 4 0 |
5 "Buerger" 6000 "privileges/ps_05_buerger.lua" 3 7 0 |
6 "Freibuerger" 15000 "privileges/ps_06_freibuerger.lua" 3 10 0 |
7 "Patrizier" 30000 "privileges/ps_07_patrizier.lua" 4 15 0 |
8 "Edelmann" 80000 "privileges/ps_08_edelmann.lua" 4 30 1 |
9 "Freiherr" 150000 "privileges/ps_09_freiherr.lua" 5 45 1 |
10 "Baron" 300000 "privileges/ps_10_baron.lua" 5 55 2 |
11 "Graf" 600000 "privileges/ps_11_graf.lua" 5 100 2 |
12 "Markgraf" 1000000 "privileges/ps_12_markgraf.lua" 5 200 3 |
13 "Fuerst" 1500000 "privileges/ps_13_fuerst.lua" 5 500 4 |
14 "Reichsfuerst" 2000000 "privileges/ps_14_reichsfuerst.lua" 5 999 5 |

放一下我的处理代码,

private String SecondNumber (String s,String s2)
{

boolean flag = false;
boolean flag1 = false;
for(int i = 0; i< s.length();i++)
{
    if(s.charAt(i) < '0' || s.charAt(i) > '9')
    {
        flag = true;
    }
    
    if(flag == true && s.charAt(i) >= '0' && s.charAt(i) <= '9')
    {flag1 = true;}
    
    if(flag == true && flag1 == true && (s.charAt(i) < '0' || s.charAt(i) > '9'))
    {
        StringBuffer sb = new StringBuffer(s);
        return sb.insert(i,s2).toString();
    }
}


return null;

}

SecondNumber(s,"00");

So stupid!

阅读 2.6k
2 个回答

看下是不是你想要的结果


    public static void main(String[] args) {
        String str="1 \"Unfreier\" 0 \"\" 0 0 0 |\r\n2 \"Gemeiner\" 250 \"privileges/ps_02_gemeiner.lua\" 1 1 0 |\r\n3 \"Freisasse\" 500 \"privileges/ps_03_freisasse.lua\" 2 2 0 |\r\n4 \"Beisasse\" 2000 \"privileges/ps_04_beisasse.lua\" 2 4 0 |\r\n5 \"Buerger\" 6000 \"privileges/ps_05_buerger.lua\" 3 7 0 |\r\n6 \"Freibuerger\" 15000 \"privileges/ps_06_freibuerger.lua\" 3 10 0 |\r\n7 \"Patrizier\" 30000 \"privileges/ps_07_patrizier.lua\" 4 15 0 |\r\n8 \"Edelmann\" 80000 \"privileges/ps_08_edelmann.lua\" 4 30 1 |\r\n9 \"Freiherr\" 150000 \"privileges/ps_09_freiherr.lua\" 5 45 1 |\r\n10 \"Baron\" 300000 \"privileges/ps_10_baron.lua\" 5 55 2 |\r\n11 \"Graf\" 600000 \"privileges/ps_11_graf.lua\" 5 100 2 |\r\n12 \"Markgraf\" 1000000 \"privileges/ps_12_markgraf.lua\" 5 200 3 |\r\n13 \"Fuerst\" 1500000 \"privileges/ps_13_fuerst.lua\" 5 500 4 |\r\n14 \"Reichsfuerst\" 2000000 \"privileges/ps_14_reichsfuerst.lua\" 5 999 5 |";
        //指定替换第1,2,3行的数字
        String result1=updatesNumByIndex(new int[]{1,2,3},str, "00");
        //默认替换所有行的数字
        String result2=updatesNumByIndex(null,str, "00");
        System.out.println(result1);
        System.out.println(result2);
    }
    /**
     * 
     * @param indexs 指定行下标
     * @param input 原字符串
     * @param replement 填充物
     * @return
     */
    public static String updatesNumByIndex(int[] indexs,String input,String replement){
        String indexRegex="\\d{1,100000}";
        if(indexs!=null&&indexs.length>0){
            StringBuffer groups=new StringBuffer("(?:");
            int len=indexs.length;
            for(int i=0;i<len;i++){
                groups.append(indexs[i]);
                groups.append(i!=len-1?"|":")");
            }
            indexRegex=groups.toString();
        }
        String regex="(?m)(?<=^"+indexRegex+"\\s\"\\w{1,100000}\"\\s\\d{1,100000})\\b";
        return input.replaceAll(regex,replement);
    }
        
        String str="3 \"Freisasse\" 500 \"privileges/ps_03_freisasse.lua\" 2 2 150  200";
        Matcher m= Pattern.compile("[0-9]").matcher(str);
        int i = 0;
        int index;
        int num;
        String numChar;
        int lastIndex;
        while (m.find()) {
            numChar = m.group();
            lastIndex = str.indexOf(numChar);
            if (i == 1) { // 根据需要修改
                index = str.indexOf(numChar, lastIndex + 1);
                num = Integer.valueOf(numChar);
                num = num * 100;//0 * 100 还是0 可以是任何操作数据逻辑
                str = str.substring(0, index) + num + str.substring(index + 1);
                break;
            }
            i++;
        }

        System.out.println(str);

测试结果:

转化前:3 "Freisasse" 300 "privileges/ps_03_freisasse.lua" 2 2 150  200
转化后:3 "Freisasse" 30000 "privileges/ps_03_freisasse.lua" 2 2 150  20000 

看看是否符合你的要求

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题