我试图通过将搜索字段中的用户输入分解为对象来在客户端构建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;
这不会处理引号中的字符串。
答案 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
。