javascript - 将搜索查询字符串分解为对象

时间:2017-04-08 07:26:44

标签: javascript regex

我试图通过将搜索字段中的用户输入分解为对象来在客户端构建api查询。

实施例, 搜索查询

arg1:"2 words" business corporate arg2:val2

期望值

{
    arg1: "2 words",
    arg2: "val2",
    extra: "business corporate"
}

我试过这样做。

var query = initquery.split(' ');
var obj = {};
for(var i=0; i<query.length; i++){
    var s = query[i].split(':');
    if(s.length == 2) {
        initquery = initquery.replace(query[i], '');
        obj[s[0]] = s[1];
    }
}
obj.extra = initquery;

这不会处理引号中的字符串。

2 个答案:

答案 0 :(得分:2)

您可能想看看这个:

public class MyLabel extends Label {

private float customScale = 1; //default Scale if text's width < givenWidth
private GlyphLayout layout;
private boolean isWrap; //if wrap, ignore fit
private float defaultWidth;
protected boolean autoFit = false; //set true to auto fit when text changed

@Override
public void draw(Batch batch, float parentAlpha) {
    //draw background
    if(background != null)
        batch.draw(background, getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation());
    else if(background9patch != null){
        background9patch.draw(batch, getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation());
    }
    //draw text
    super.draw(batch, parentAlpha);
}

@Override
public void setText(CharSequence newText) {
    super.setText(newText);
    if(autoFit){
        float prefWidth = getPrefWidth();
        if(defaultWidth == 0 && getWidth() == 0){
            setWidth(prefWidth);
        } else {
            if (layout != null && !isWrap)
                if (getWidth() > 0) {
                    getStyle().font.getData().setScale(customScale);
                    layout.setText(getBitmapFontCache().getFont(), newText);
                    float textWidth = layout.width;
                    if (textWidth > getWidth())
                        setFontScale((getWidth() / textWidth));
                    else
                        setFontScale(customScale);
                }
        }
    }
}

答案 1 :(得分:0)

感谢@Barmar this helpful comment,我想出了这个正则表达式来捕获args(假设它们后面跟着一个数字和一个冒号):

var pattern = /((^|\s)arg\d:").*?(?=")"?|(\sarg\d:\w*)/g;

可以通过以下方式提取查询的其余部分:

query.replace(pattern,"");

然后创建最终对象应该是直截了当的。尽管如此,考虑到在查询字符串中使用双引号可能会增加复杂性,您应该考虑为您的应用程序编写解析器。

<强>更新 更新了正则表达式以匹配字符串的开头,并且仅在空白字符后匹配arg