在Java中将字符串中的括号内的值作为整数返回

时间:2015-03-02 21:17:29

标签: java regex

我从cobol copybook中提取格式信息,需要使用switch或if语句来获取inside()中的值。所有值都在一个字符串数组中,我正在使用下面的示例值迭代数组。

X(37)
9(03)
X(15)
9(07)
X
X(1)
X(253)

我的开关案例

private int convertSize(String pic) {
    switch (pic) {      
    case "X" :
        return 1;
    case "X("+ "string inside" +")" :
        return Integer.parseInt("string inside");
    case "9("+ "string inside" +")" :
        return (Integer.parseInt("string inside")+1);
    default:
        return 0;
    }

我应该用"字符串替换内容"得到结果? " \ d +"不会工作,因为它在数组中保存为字符串。

3 个答案:

答案 0 :(得分:2)

你走了。完全单元测试...

package com.example;

import org.junit.Assert;
import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Question28819604 {

    @Test
    public void test() {
        Assert.assertEquals(37,convertSize("X(37)"));
        Assert.assertEquals(4,convertSize("9(03)"));
        Assert.assertEquals(15,convertSize("X(15)"));
        Assert.assertEquals(8,convertSize("9(07)"));
        Assert.assertEquals(1,convertSize("X"));
        Assert.assertEquals(1,convertSize("X(1)"));
        Assert.assertEquals(253,convertSize("X(253)"));
        Assert.assertEquals(0,convertSize("non-match"));
        Assert.assertEquals(0,convertSize(null));
        Assert.assertEquals(0,convertSize("X(broken)"));
        Assert.assertEquals(0,convertSize("X(broken"));
    }

    private Pattern xPattern = Pattern.compile("X\\((\\d+)\\)");
    private Pattern ninePattern = Pattern.compile("9\\((\\d+)\\)");

    private int convertSize(String pic) {
        if (pic == null) {
            return 0;
        }

        Matcher xPatternMatcher = xPattern.matcher(pic);
        Matcher ninePatternMatcher = ninePattern.matcher(pic);

        if ("X".equals(pic)) {
            return 1;
        } else if (xPatternMatcher.matches()) {
            return Integer.parseInt(xPatternMatcher.group(1));
        } else if (ninePatternMatcher.matches()) {
            return Integer.parseInt(ninePatternMatcher.group(1)) + 1;
        } else {
            return 0;
        }
    }
}

答案 1 :(得分:1)

这是一个带示例的工作代码

public static void main(String[] args) {
        System.out.println(convertSize("X(37)"));
        System.out.println(convertSize("X."));
        System.out.println(convertSize("X(9941)"));
    }

    private static int convertSize(String pic) {
        try {
            String myNumberInString = pic.substring(pic.indexOf("(")+1, pic.indexOf(")"));
            int myNumberInInteger = Integer.valueOf(myNumberInString);
            return myNumberInInteger;
        } catch (Exception e){
            return 0;
        }
    }

此程序的输出将是

37
0
9941

在这种情况下,您无法使用切换方法。

答案 2 :(得分:0)

这是一个解决方案(您仍然需要检查例外情况!)

模式可以编译一次(作为类初始化的一部分)

private int convertSize(String pic) {
    Pattern p = Pattern.compile("\\((\\d+)\\)");
    Matcher m = p.matcher(pic);
    if (m.find()) {
        if(pic.startsWith("9")) {
            return Integer.valueOf(m.group(1)+1);
        } else if(pic.startsWith("X")) {
            return Integer.valueOf(m.group(1));
        }
    }
    return 0;
}