我有1个公式 他可能现在这样的
 (C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549))都是C开头的然后后面一堆数字,这些计数进行运算,还有还有可能重复我想把里面的C301790860  C301790858 C301120543等等解析出来,重复的只要1个,谢谢

解决方案 »

  1.   

    是解析出来字符串吗?
    如果是的话,看看下面的代码
    String target = "(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549))";
    String[] ps = target.split("\\p{Punct}");
    Set<String> ss = new HashSet<String>();
    for(String str : ps){
    if(!str.trim().equals("")){
    ss.add(str);
    }
    }
    for(String str : ss){
    System.out.println(str);
    }
    不知道楼主是这意思不?
      

  2.   


    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */package test;import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;/**
     *
     * @author Administrator
     */
    public class Main {    /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            Set<String> set=new HashSet<String>();
            String str="(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549)) ";
            String regex="C\\d+";
            Pattern pattern=Pattern.compile(regex);
            Matcher matcher=pattern.matcher(str);
            while(matcher.find()){
                set.add(matcher.group());
            }
            Iterator iter=set.iterator();
           while(iter.hasNext()){
            System.out.println(iter.next());
           }
        }}
      

  3.   

    你可以把这个公式赋值给一个Sring,然后再查C301790860  C301790858 C301120543第一次出现的索引,再replace一下,最后把第一次出现的索引再次repalce一下就可以了。
      

  4.   

    如果再假设P30012 = C300023 - C30145+C30123;P30013 = C300025 - C30145+C30129
    (C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549)) 
    变成了 
    P300012*P30013*(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549))怎么把C开头的全解析出来呢?
      

  5.   


    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {

    /**
     * 获得所有以C开发头的不重复的数据
     * @param s
     * @return Iterator
     */
    public static Iterator getIteratorStringC(String s){
    //map的key值不能重复 重复数据自动覆盖
    Map map = new HashMap();
    //匹配以C开头的  或者用C或P开头[CP][0-9]
    Pattern p = Pattern.compile("[C][0-9]+");
    Matcher m = p.matcher(s);
    while(m.find()){
    map.put(m.group(), null);
    }

    return  map.keySet().iterator();
    }
    /**
     * 获得所有P开发头的不重复的数据
     * @param s
     * @return Iterator
     */
    public static Iterator getIteratorStringP(String s){
    //map的key值不能重复 重复数据自动覆盖
    Map map = new HashMap();
    //匹配以C开头的  或者用C或P开头[CP][0-9]
    Pattern p = Pattern.compile("[P][0-9]+");
    Matcher m = p.matcher(s);
    while(m.find()){
    map.put(m.group(), null);
    }

    return  map.keySet().iterator();
    }
    //
    //测试
    public static void main(String[] ar){
    String testString = "P300012*P30013*(C301790860/C301790858)" +
    "((C301120543+C301120544+C301120545+" +
    "C301120546+C301120547+C301120548+C301120549-C301120560" +
    "-C301120561-C301120562-C301120563-C301120564-" +
    "C301120565-C301120566-C301120567)/(C301120543+" +
    "C301120544+C301120545+C301120546+C301120547+" +
    "C301120548+C301120549)) ";
    Iterator ite = getIteratorStringC(testString);
    while(ite.hasNext()){
    //全部打出
    System.out.println(ite.next().toString());
    }
    }

    }输出:
    C301120548
    C301120561
    C301120566
    C301790858
    C301120546
    C301120565
    C301120549
    C301120545
    C301120562
    C301790860
    C301120563
    C301120544
    C301120564
    C301120543
    C301120560
    C301120547
    C301120567
      

  6.   

    楼上兄弟,如果取P的话,把里面的c开头解析出来再加到取C的那个map里?
      

  7.   

    这样调用可以吗?
    //测试
    public static void main(String[] ar){
    String testString = "P300012*P30013*(C301790860/C301790858)" +
    "((C301120543+C301120544+C301120545+" +
    "C301120546+C301120547+C301120548+C301120549-C301120560" +
    "-C301120561-C301120562-C301120563-C301120564-" +
    "C301120565-C301120566-C301120567)/(C301120543+" +
    "C301120544+C301120545+C301120546+C301120547+" +
    "C301120548+C301120549)) ";
    String pstring1="P30012 = C300023 - C30145+C30123";
    String pstring2="P30013 = C300025 - C30145+C30129"; 
    Iterator ite = getIteratorStringC(testString+pstring1+pstring2);
    while(ite.hasNext()){
    //全部打出
    System.out.println(ite.next().toString());
    }
    }
    输出
    C301120548
    C301120561
    C300023
    C301120566
    C301790858
    C301120546
    C30129
    C301120565
    C301120549
    C301120545
    C301120562
    C301790860
    C301120563
    C30145
    C301120544
    C300025
    C301120564
    C30123
    C301120543
    C301120560
    C301120547
    C301120567
      

  8.   

    我试了2楼的程序,用正则 "\\p{Punct}+"  和 "\\p{Punct}"   都能得到正确结果,这是什么原因,各位解释下。  
      

  9.   


    wo ye xaing zhi dao
      

  10.   

    \p{Punct} 表示标点符号:!"#$%&'()*+,-./:; <=>?@[\]^_`{|}~ 
    也就是以所有标点符号来切割 
    内嵌的正则表达式,类似的还有如下, 
    POSIX 字符类(仅 US-ASCII) 
    \p{Lower} 小写字母字符:[a-z] 
    \p{Upper} 大写字母字符:[A-Z] 
    \p{ASCII} 所有 ASCII:[\x00-\x7F] 
    \p{Alpha} 字母字符:[\p{Lower}\p{Upper}] 
    \p{Digit} 十进制数字:[0-9] 
    \p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}] \p{Graph} 可见字符:[\p{Alnum}\p{Punct}] 
    \p{Print} 可打印字符:[\p{Graph}\x20] 
    \p{Blank} 空格或制表符:[ \t] 
    \p{Cntrl} 控制字符:[\x00-\x1F\x7F] 
    \p{XDigit} 十六进制数字:[0-9a-fA-F] 
    \p{Space} 空白字符:[ \t\n\x0B\f\r] 
      

  11.   

    我明白了, 正则"\\p{Punct}"表示一个标点符号,"\\p{Punct}+"表示一个以上标点符号,前者拆分出来的数组ps.length要比后者长,但是前者拆分出来的空字符串被语句if(!str.trim().equals(""))过滤掉了。所以从性能上和可读性看,用"\\p{Punct}+"比较好。