构建模式以从字符串中提取数据

时间:2012-11-08 09:51:03

标签: java regex pattern-matching

我有以下形式的字符串:

"abc" 1 2 1 13 
"efgh" 2 5 

基本上,引号中的字符串后跟由空格字符分隔的数字。 我需要提取字符串和数字。

所以对于例如,对于第一行,我想要

  • abc存储在String变量中(即没有引号)和
  • 要存储int的{​​{1}}数组。

我试图创建一个这样做的模式,但我有点困惑。

[1,2,1,13]

现在不确定如何继续。我意识到,有了这种模式,我有点想要提取整条线路吗?也许多种模式会有所帮助吗?

Pattern P = Pattern.compile("\A\".+\"(\s\d+)+");

同样,不太确定如何将字符串和整数排除在外。任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:1)

我宁愿将字符串拆分为空格,而不是构建复杂的正则表达式,并将其与PatternMatcher类一起使用。

这样的事情: -

String str = "\"abc\" 1 2 1 13 ";
String[] arrr = str.split("\\s");
System.out.println(Arrays.toString(arrr));

输出: -

["abc", 1, 2, 1, 13]

显示你的意图更清楚,你想要做什么。

然后,您可以从字符串数组中获取stringinteger部分。您需要对整数元素执行Integer.parseInt()


如果您的字符串中可能包含空格,那么在这种情况下,您需要Regex。更好的是@m.buettner's answer

中的那个

答案 1 :(得分:1)

使用捕获组一次性获取两个部分,然后在空格处分割数字。

Pattern pattern = Pattern.compile("\"([^\"]*)\"\\s*([\\d\\s]*)");

Matcher m = pattern .matcher(input);
while (m.find()) {
    String str = m.group(1);
    String[] numbers = m.group(2).split("\\s");
    // process both of them       
}

正则表达式中的每组括号稍后将对应一个group(从左到右计算左括号,从1开始)。

答案 2 :(得分:0)

请尝试将它分开String和int

        String s = "\"abc\" 1 2 1 13 ";

        s = s.replace("\"", "");
        String sarray[] = s.split(" ");

        int i[] = new int[10];
        String si[] = new String[10];
        int siflag = 0;
        int iflag = 0;
        for (String st : sarray) {
            try {
                int ii = Integer.parseInt(st)
                i[iflag++] = ii;
            } catch (NumberFormatException e) {
                si[siflag++] = st;
            }
        }

答案 3 :(得分:0)

StringTokenizer st = new StringTokenizer(str,"\" ");
String token = null;
String strComponent = null;
int num[] = new int[10]; // can change length dynamically by using ArrayList
int i = 0;
int numTemp = -1;
while(st.hasMoreTokens()){
    token = st.nextToken();

    try{
        numTemp  = Integer.parseInt(token);
        num[i++] = numTemp ;
    }catch(NumberFormatException nfe){
        strComponent = token.toString();
    }