如何使用正则表达式从字符串中获取数字?

时间:2014-12-18 22:30:25

标签: java regex string numbers expression

我有这个字符串

[23,22,17][17,2][23][3,29][][10,43,6][7][32,17,6][][][23,49,12][14,40,15][34,41,32][4,7,19][9,27][17][31,36,45][][32][40,27,25]

从json获得并将其保存到ArrayList中,如下所示:

 ArrayList<?> listAdress=(ArrayList<?>)jobj.get("adress");

我想只取数字并将括号中的数字保存到这样的矢量中。

 v[]={23,22,18}
 v[]={17,2} 

我试图只获取数字,但我不知道如何获取数字,直到你找到]

有人知道怎么做?

5 个答案:

答案 0 :(得分:1)

这是您的问题所需的正则表达式:

(\d*,*)*

此正则表达式explanation的链接

下面是获取数字数组的java方法:

public static List<String []> getNumberArrays (String toBeProcessed){
        List<String[]> listOfArrays = new ArrayList<String[]>();
        Pattern p = Pattern.compile("(\\d*,*)*");
        Matcher m = p.matcher(toBeProcessed);
        while(m.find()){
            String[] a ;
            a =m.group(0).split(",");
            // next statement for avoiding the printing of empty arrays
            if(a.length>=2) 
                listOfArrays.add(a);
        }
        return listOfArrays;

    }  

测试代码:

    String x = "[23,22,17][17,2][23][3,29][][10,43,6][7][32,17,6][][][23,49,12][14,40,15][34,41,32][4,7,19][9,27][17][31,36,45][][32][40,27,25]" ;
    List<String[]> listOfArrays = new ArrayList<String[]>();
    listOfArrays = getNumberArrays(x);
    for(String[] a :listOfArrays){
        System.out.println(Arrays.toString(a));
     }

输出

[23, 22, 17]
[17, 2]
[3, 29]
[10, 43, 6]
[32, 17, 6]
[23, 49, 12]
[14, 40, 15]
[34, 41, 32]
[4, 7, 19]
[9, 27]
[31, 36, 45]
[40, 27, 25]

答案 1 :(得分:0)

我知道你要求使用正则表达式,但我不确定这是进行这种简单解析的唯一或最佳方法。

这是一个快速(而不是那么安全)的代码:

public class HelloWorld{

     public static void main(String []args){
        String input = "[23,22,17][17,2][23][3,29][][10,43,6][7][32,17,6][][][23,49,12][14,40,15][34,41,32][4,7,19][9,27][17][31,36,45][][32][40,27,25]";
        input = input.substring(1, input.length()-1);
        String[] vectors = input.split("\\]\\[");

        for(String vector : vectors)
        {
            System.out.println(String.format("\"%s\"", vector));
        }
     }
}

输出:

  

&#34; 23,22,17&#34;
  &#34; 17,2&#34;
  &#34; 23&#34;
  &#34; 3,29&#34;
  &#34;&#34;
  &#34; 10,43,6&#34;
  &#34; 7&#34;
  &#34; 32,17,6&#34;
  &#34;&#34;
  &#34;&#34;
  &#34; 23,49,12&#34;
  &#34; 14,40,15&#34;
  &#34; 34,41,32&#34;
  &#34; 4,7,19&#34;
  &#34; 9,27&#34;
  &#34; 17&#34;
  &#34; 31,36,45&#34;
  &#34;&#34;
  &#34; 32&#34;
  &#34; 40,27,25&#34;

问题是:您必须确保作为输入提供的字符串始终格式良好(以[,以a结尾]开头,并以[以[结尾]开头的段组成)。然而,正则表达式几乎相同(无效输入=无输出或部分输出)。

一旦你的字符串用逗号分隔数字,其余的工作就很容易了(你可以再次拆分然后解析为整数)。

答案 2 :(得分:0)

    public void importarCorreos() throws Exception{
        @SuppressWarnings("deprecation")
        ClientRequest cr = new       ClientRequest("http://di002.edv.uniovi.es/~delacal/tew/1415/practica02/servicio_correos.php");

        @SuppressWarnings("deprecation")
        String result = cr.get(String.class).getEntity(String.class);

        CorreosService service = Factories.services.createCorreosService();
        //Imprimimos todo el flujo JSON recibido en formato cadena.
        System.out.println(result);
        //Procesamos el texto JSON y lo pasamos a formato SIMPLE-JSON
        Object obj=JSONValue.parse(result);
        JSONArray correos = (JSONArray)obj;
        ListIterator li = correos.listIterator();
        while(li.hasNext()){
            JSONObject jobj =(JSONObject) li.next();
            Correo c = new Correo();
            c.setFechaHora( Long.parseLong(jobj.get("fechahora").toString()));
            c.setAsunto(jobj.get("asunto").toString());
            c.setCuerpo(jobj.get("cuerpo").toString());
            c.setCarpeta( Integer.parseInt(jobj.get("carpeta").toString()));
            c.setLogin_user(usuario.getLogin());
            ArrayList<?> listaDestinatarios=(ArrayList<?>)jobj.get("destinatarios");
            service.saveCorreo(c);

        }

   }

这是我的功能,主要是我从这个网址获得了一封带有邮件的json。我使用该网址中的字段创建一个新邮件。但是Mails类中的一个字段是mail_contacts,你应该在其中保存每个联系人的地址,例如向量[1,2,3],这是来自地址的id。

那么如何将数字输入[],并将其保存到字段mail_contacts它的数组。

我可以像这样保存:

     c.setMailAdress(Here i want an array with the numbers from each [])

答案 3 :(得分:0)

这是怎么回事:

public static void main(String[] args) {
    String testStr = "[23,22,17][17,2][23][3,29][][10,43,6][7][32,17,6][][][23,49,12][14,40,15][34,41,32][4,7,19][9,27][17][31,36,45][][32][40,27,25]";
    ArrayList<String[]> result = new ArrayList<>();
    String[] resTmp = testStr.split("\\[|\\]\\[");  // First split input into vectors

    for (String vecDef: resTmp)    // Then split each vector into a String[]
        result.add(vecDef.split(","));

    for (String[] s : result) {    // result = ArrayList with an element for each vector
        for (String ss : s)        // Each element is an array of Strings each being a number
            System.out.print(ss + " ");

        System.out.println();
    }
}

答案 4 :(得分:0)

@ulix

好的,这给了我想要的退出:

00:53:20,413 INFO [stdout](默认任务-6)23 22 17

00:53:20,414 INFO [stdout](默认任务-6)17 2

00:53:20,414 INFO [stdout](默认任务-6)23

00:53:20,416 INFO [stdout](默认任务-6)3 29

00:53:20,416 INFO [stdout](默认任务-6)

00:53:20,417 INFO [stdout](默认任务-6)10 43 6

但我想将每个位置从字符串保存到int数组中,如int v [] = {23,22,17}