2

我有以下形式的字符串:

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

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

因此,例如,对于第一行,我想要

  • abc存储在一个String变量中(即没有引号)和
  • int要存储的数组[1,2,1,13]

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

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

现在不知道如何进行。我意识到用这种模式我会提取整条线?也许多种模式会有所帮助?

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

同样,不太确定如何使字符串和整数脱离行列。任何帮助表示赞赏!

4

4 回答 4

1

我宁愿只在空间上拆分字符串,而不是构建复杂的正则表达式,并将其与Pattern类一起使用Matcher

像这样的东西: -

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

输出: -

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

更清楚地表明您的意图,即您想要做什么。

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


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

于 2012-11-08T09:58:06.747 回答
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)。

于 2012-11-08T10:00:12.577 回答
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;
            }
        }
于 2012-11-08T10:04:09.763 回答
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();
    }
于 2012-11-08T10:13:41.727 回答