在特定的其他子字符串之后获取子字符串的最有效方法

时间:2015-11-17 14:52:53

标签: java regex string parsing substring

如果我有一个看起来像这样的字符串:

String text = "id=2009,name=Susie,city=Berlin,phone=0723178,birthday=1991-12-07";

我只想获得信息namephone。我知道如何解析整个String,但在我的具体情况下,只获取这两个“字段”很重要。

那么让我的搜索方法执行以下操作的最佳/最有效方法是什么:

搜索子字符串“name =”并返回其后的子字符串(“Susie”),直到它到达下一个逗号

我的方法是:

  1. 获取“name =”first
  2. 的最后一个索引
  3. 然后使用此索引作为我的解析方法的新开始
  4. 关于如何更有效地使用更精简的代码,可能还有其他任何建议吗?感谢您的任何输入

2 个答案:

答案 0 :(得分:6)

您可以使用以下正则表达式捕获phonename之后的预期单词,并从匹配对象中获取frist组:

(?:phone|name)=([^,]+)

关于以下命令,如果它可能恰好包含一个包含phonename的单词作为更全面的方式,则可以在您的名字前面添加一个逗号。

(?:^|,)(?:phone|name)=([^,]+)

详细了解正则表达式http://www.regular-expressions.info/

答案 1 :(得分:0)

正则表达式可能更有效,但为了便于阅读,我<3 Guava

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    onDrawReady = true; 

    // for eraser
    canvas.saveLayerAlpha(0, 0, canvas.getWidth(), canvas.getHeight(), 0xff, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);

    imageRenderedAtLeastOnce = true;

    if (delayedZoomVariables != null) {
        setZoom(delayedZoomVariables.scale, delayedZoomVariables.focusX,
                delayedZoomVariables.focusY, delayedZoomVariables.scaleType);
        delayedZoomVariables = null;
    }

    canvas.concat(matrix);      

    for (DrawObject d : paths) {
        if (d.getType() == MODE_DRAWING) {
            canvas.drawPath(d.getPair().first, d.getPair().second); 
        } else if (d.getType() == MODE_TEXT) {
            canvas.drawText(d.getText(), d.getX(), d.getY(),
                    d.getPair().second);
        } else if (d.getType() == MODE_ARROW) {
            canvas.drawLine(d.getStartX(), d.getStartY(), d.getX(),
                    d.getY(), d.getPair().second);
            fillArrow(canvas, d.getStartX(), d.getStartY(), d.getX(),
                    d.getY(), d.getPair().second);
        } else if (d.getType() == MODE_CIRCLE) {
            RectF oval2 = new RectF(d.getStartX(), d.getStartY(), d.getX(),
                    d.getY());
            canvas.drawOval(oval2, d.getPair().second);
        } else if (d.getType() == MODE_RECTANGLE) {
            canvas.drawRect(d.getStartX(), d.getStartY(), d.getX(),
                    d.getY(), d.getPair().second);
        } else if (d.getType() == MODE_ERASE) {
            canvas.drawPath(d.getPair().first, d.getPair().second);
        }
    }
    canvas.save();
}