数据格式是:
{@}name:=name1{@}old:=20{@}sex:=nan
要求1、
获取old:=后面的内容20
返回结果:20
要求2、
获取sex:=后面的内容nan
返回结果:nan
要求3、
获取old:=后面的内容20换成100
返回结果:{@}name:=name1{@}old:=100{@}sex:=nan
要求4、
获取sex:=后面的内容nan换成nv
返回结果:{@}name:=name1{@}old:=20{@}sex:=nv麻烦了啊。

解决方案 »

  1.   

    查询比较简单,但是替换的不太熟
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {
    public static void main(String[] args) {
    String str = "{@}name:=name1{@}old:=20{@}sex:=nan";
    String regex = "old:=(\\d+).*sex:=(\\w+)";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
    String old = matcher.group(1);
    String sex = matcher.group(2);

    System.out.println("Old:=" + old + ", Sex:=" + sex);
    }
    }
    }
      

  2.   

    替换的结果好了,但是感觉这种方式还是不太爽:
    public class Test {
    public static void main(String[] args) {
    String str = "{@}name:=name1{@}old:=$1{@}sex:=$2"; // 使用分组来替换
    String re = "100na"; // 使用来替换的字符串
    String result = re.replaceAll("(\\d+)(\\w+)", str); // 替换的结果
    System.out.println(result);
    }
    }
      

  3.   

    或者你可以先把{@}name:=name1{@}old:=20{@}sex:=nan 中的name提取出来,然后与要用来替换的old,sex再按特殊格式组成一个新的字符串,如:name1{@}newOld{@}newSex这种格式,再构造分组替换的字符串来分组替换来达到目的。
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {
    public static void main(String[] args) {
    String src = "{@}name:=name1{@}old:=20{@}sex:=nan";
    String result = replace(src, "100", "na");
    System.out.println(result);
    } /**
     * @param src 原来的字符串
     * @param old 新替换的old
     * @param sex 新替换的sex
     * @return
     */
    public static String replace(String src, String old, String sex) {
    Pattern pattern = Pattern.compile("name:=(\\w+)");
    Matcher matcher = pattern.matcher(src);
    String name = "";
    // 先从原来的字符串中把名字提取出来
    if (matcher.find()) {
    name = matcher.group(1);
    } // 用分组来进行替换
    String str = "{@}name:=$1{@}old:=$2{@}sex:=$3";
    String replaceStr = name + "{@}" + old + "{@}" + sex;
    String result = replaceStr.replaceAll("(\\w+)\\{@\\}(\\d+)\\{@\\}(\\w+)", str); return result;
    }
    }
      

  4.   

    我感觉一个正则就可以搞定
    代码如下
    供参考
    String s = "{@}name:=name1{@}old:=20{@}sex:=nan";
    String regex = "(\\{@\\}name:=)(.+)(\\{@\\}old:=)(.+)(\\{@\\}sex:=)(.+)";
    Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(s);
            while (matcher.find()) {
                String old = matcher.group(4);
                String sex = matcher.group(6);
                System.out.println("old:=" + old + ", sex:=" + sex);
            }
            s = s.replaceAll(regex, "$1$2$3100$5nv");
            System.out.println(s);
      

  5.   


    小弟研究过正则几天,最恼火的就是表达式的书写了~~~
    但楼上的问题为何不用String类,非要用正则呢,个人认为,String类简单易用,且不用正则那样费力去匹配、查找,如下:
    public static void main(String[] args)
        {
            String str = "{@}name:=name1{@}old:=20{@}sex:=nan";
            String key_old = "{@}old:=";
            String key_sex = "{@}sex:=";
            int index1 = str.indexOf(key_old);
            int index2 = str.indexOf(key_sex);
            String old_str = str.substring(index1 + key_old.length(), index2);//查找
            System.out.println(old_str);
            
            str = str.replace(old_str, "100");//替换
            System.out.println(str);
        }
      

  6.   

    都用sex表示性别了,结果后面居然是:nan,nv你就不能改成male跟female么囧
      

  7.   

    我表达的不好啊。其实这个可能是很多格式啊
         {@}name:=name1{@}old:=20{@}sex:=nan比如, {@}name:=name1{@}old:=20{@}sex:=nan{@}xxx:=xx但是格式都是{@}xxx:= 注等号后面可能为空其实我就是想
    1、可以获取   {@}xxx:=
    等号后面的数值,
    2、可以替换{@}xxx:=
    等号后面的数值,比如: 
    {@}任意:=数值
    1、能获取上面格式的“数值”
    2、能替换上面格式的“数值”
    对不起大家乐 55555555555555555555努力过正则是在没搞明白啊!
      

  8.   

    我表达的不好啊。 其实这个可能是很多格式啊 
        {@}name:=name1{@}old:=20{@}sex:=nan 比如, {@}name:=name1{@}old:=20{@}sex:=nan{@}xxx:=xx 但是格式都是{@}xxx:= 注等号后面可能为空 其实我就是想 
    1、可以获取  {@}xxx:= 
    等号后面的数值, 
    2、可以替换{@}xxx:= 
    等号后面的数值, 
    比如: 
    {@}任意:=数值 
    1、能获取上面格式的“数值” 
    2、能替换上面格式的“数值” 
    对不起大家乐 55555555555555555555努力过正则是在没搞明白啊! 
      

  9.   

    我表达的不好啊。 其实这个可能是很多格式啊 
        {@}name:=name1{@}old:=20{@}sex:=nan 比如, {@}name:=name1{@}old:=20{@}sex:=nan{@}xxx:=xx 但是格式都是{@}xxx:= 注等号后面可能为空 其实我就是想 
    1、可以获取  {@}xxx:= 
    等号后面的数值, 
    2、可以替换{@}xxx:= 
    等号后面的数值, 
    比如: 
    {@}任意:=数值 
    1、能获取上面格式的“数值” 
    2、能替换上面格式的“数值” 
    对不起大家乐 55555555555555555555努力过正则是在没搞明白啊! 
      

  10.   

    有没有特定的替换,还是所有的都要替换?
    public static void main(String[] args) {
    String str = "{@}name:=name1{@}old:=20{@}sex:=nan";
    Pattern pattern = Pattern.compile("}(([^:]+):=([^\\{]+))\\{?",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = pattern.matcher(str);
    String replaceStr = "替换str";
    while (m.find()) {
    //在这里想换哪个换哪个
    if ("old".equals(m.group(2))) {
    System.out.println(m.group(1).replaceAll(m.group(3), replaceStr));
    } else {
    System.out.println(m.group(2) + "#" + m.group(3));
    }
    }
    }
      

  11.   

    试试这个import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Temp { public static void main(String[] args) {
    String str = "{@}name:=name1{@}name:=20{@}name:=nan{@}xxx:=xx";
    String reg = "(@\\}.*?:=)(.*?)\\{";
    str = str+"{";
    Pattern pattern = Pattern.compile(reg);
    Matcher matcher = pattern.matcher(str);
    StringBuffer sb = new StringBuffer();
    String replaceStr;
    String afterReplace=str;
    while (matcher.find()) {
    replaceStr = matcher.group(2);
    System.out.println(replaceStr);
    }
    afterReplace = str.replaceAll(reg, "$1***");//把找到的东西都替换为***,这个根据你自己需要
    System.out.println(afterReplace); }
    }
      

  12.   

    你这个替换会出问题的,比如 "{@}name:=name1{@}name:=20{@}name:=nan{@}xxx:=xx"; 我只想替换
    :+后面的xx,但是你这个会把前面的3个xxx中也替换掉2个
      

  13.   


    你可以看一下楼主发上来的字符串哦
    {@}name:=name1{@}old:=20{@}sex:=nan
    明显":=" 前面的是key,后面的是value
    如果是多组数据在一起的话,
    不会是{@}name:=name1{@}name:=20{@}name:=nan{@}xxx:=xx"
    而是{@}name:=name1{@}old:=20{@}sex:=nan{@}name:=name1{@}old:=20{@}sex:=nan{@}name:=name1{@}old:=20{@}sex:=nan....
    这样把
    old:= *** 的替换,会有什么问题
      

  14.   

    比如 {@}name1:=name{@}old:=20{@}sex:=nan{@} 当你替换 name时,是不是也会把name1中的name也替换掉了
      

  15.   


    public static void main(String[] args) {
    String str = "{@}name:=name1{@}old:=20{@}sex:=nan";
    Pattern pattern = Pattern.compile("}(([^:]+):=([^\\{]+))\\{?",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = pattern.matcher(str);
    String replaceStr = "替换str";
    while (m.find()) {
    //在这里想换哪个换哪个
    if ("name".equals(m.group(2))) {
    System.out.println(m.group(1).replaceAll(m.group(3), replaceStr));
    } else {
    System.out.println(m.group(2) + "#" + m.group(3));
    }
    }
    }
    把红的那里改一下,就是你要换的,你可以自己试一下
      

  16.   

        Pattern pattern = Pattern.compile("}(([^:]+):=([^\\{]+))\\{?",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);确实可以啊但是说说什么意思被   !!!
    而且发现没用{@}控制啊就用了:=这样有一定风险啊
      

  17.   

    再次感谢大家啊。
    我表达能力不好啊,在说下。希望能说明白啊。对不起大家了:我的数据格式是类似: .......{@}name:=name1{@}old:=20{@}sex:=nan........
    但是没准有多少个啊,即可能是{@}name:=name1{@}old:=20{@}sex:=nan也可能有些数据是
    {@}stature:=178{@}name:=name1{@}old:=20{@}sex:=nan{@}class:=class1{@}avoirdupois:=100不过不管多少个格式都是{@}filed:=value其实我需要的是,两个方法一个方法是,传入filed就能返回给我这个filed对应的数值,
    一个方法就是我给filed和值,就能把数据里的那个filed的数值换成我需要的那个值。
      

  18.   

    再次感谢大家啊。 
    我表达能力不好啊,在说下。希望能说明白啊。对不起大家了: 我的数据格式是类似: .......{@}name:=name1{@}old:=20{@}sex:=nan........ 
    但是没准有多少个啊,即可能是{@}name:=name1{@}old:=20{@}sex:=nan也可能有些数据是 
    {@}stature:=178{@}name:=name1{@}old:=20{@}sex:=nan{@}class:=class1{@}avoirdupois:=100 不过不管多少个格式都是{@}filed:=value 其实我需要的是,两个方法一个方法是,传入filed就能返回给我这个filed对应的数值, 
    一个方法就是我给filed和值,就能把数据里的那个filed的数值换成我需要的那个值。