【问题标题】:How to extract a very specific sets of string parts from QR decoded string?如何从 QR 解码字符串中提取一组非常特定的字符串部分?
【发布时间】:2017-09-17 13:50:34
【问题描述】:

我需要选择一个非常大的字符串(从二维码解码)的特定部分,以在 Android 的 TextView 元素中设置为文本。

//*these are the parts of the string whose corresponding values I need as a text for my TextViews.*

String uid, name, gname, gender, house, street, ps, po, dist, subdist, state, pin, address, dob;

//*this 'string' object holds the decoded qr string*

String string = "uid="001" name="Akbar Shah" gender="M" yob="1989" gname="Jahangir Shah" co="S/O: Jahangir Shah" house="45/5" street="Huzurey Ala Street" vtc="Alibagh" po="Bagnan" dist="Faridabad" subdist="Alamgarh" state="Andhra" pc="6754674" dob="15/04/89"";

//*this is where I am using substring() to get a specific part of the string value*

uid = string.substring(string.indexOf("uid=")+5, string.indexOf("name=")-2);
name = string.substring(string.indexOf("name=")+6, string.indexOf("gender=")-2);
gname = string.substring(string.indexOf("gname=")+7, string.indexOf("co=")-2);
gender = string.substring(string.indexOf("gender=")+8, string.indexOf("yob=")-2);

house = string.substring(string.indexOf("house=")+7, string.indexOf("street=")-2);
street = string.substring(string.indexOf("street=")+8, string.indexOf("vtc=")-2);
ps = string.substring(string.indexOf("vtc=")+5, string.indexOf("po=")-2);
po = string.substring(string.indexOf("po=")+4, string.indexOf("dist=")-2);
dist = string.substring(string.indexOf("dist=")+6, string.indexOf("subdist=")-2);
subdist = string.substring(string.indexOf("subdist=")+9, string.indexOf("state=")-2);
state = string.substring(string.indexOf("state=")+7, string.indexOf("pc=")-2);
pin = string.substring(string.indexOf("pc=")+4, string.indexOf("dob=")-2);
dob = string.substring(string.indexOf("dob=")+5, string.indexOf("/>")-1);

//*this is where I have concatenated the whole address parts into one*
address = house+", "+street+", \nPS - "+ps+", \nPO - "+po+", \nDistrict - "+dist+", \nSub-Division - "+subdist+", \nState - "+state+", \nPin Code - "+pin;

 TextView tv_uid, tv_name, tv_gName, tv_gender, tv_address, tv_dob;

//*this is where  I then setText those substrings for appropriate TextViews*

                    tv_uid.setText(uid);
                    tv_name.setText(name);
                    tv_gName.setText(gname);
                    tv_gender.setText(gender);
                    tv_address.setText(address);
                    tv_dob.setText(dob);

我这样做的方式只有在解码后的二维码字符串格式保持不变的情况下才有效,即如果现在解码的字符串是这样的:

String string = "uid="001" name="Akbar Shah" gender="M" yob="1989" gname="Jahangir Shah" co="S/O: Jahangir Shah" house="45/5 " street="Huzurey Ala Street" vtc="Alibagh" po="Bagnan" dist="Faridabad" subdist="Alamgarh" state="Andhra" pc="6754674" dob="15/04/89"";

然后,如果字符串看起来像这样,我的提取方式将不起作用:

String string = "uid="002" name="Amar Tripathi" gender="M" yob="1990" vtc="Alibagh" po="Bagnan" dist="Faridabad" state="Andhra" pc= "6754674" dob="15/04/89"";

或者,像这样:

String string = "uid="003" name="Anthony Gonzalis" gender="M" yob="1985" gname="Jahangir Shah" house="45/5" street="Huzurey Ala Street" lm= "肉店后面" loc="Galianwalabagh" vtc="Alibagh" dist="Faridabad" state="Andhra" pc="6754674" dob="15/04/89"";

您可能已经注意到,substring() 不能普遍用于所有情况,因为最后两个字符串值缺少某些部分。因此,如果我指定提取夹在 gname 和 co 之间的特定子字符串,除了第一种情况,在最后两种情况下,它将无法找到 co,因此代码行的执行返回错误。 有没有更好的方法?

附:我可以从“”中提取所有字符串部分吗?

例如“001”是字符串的一部分,我只想从中获取双引号内的 001 部分。

【问题讨论】:

    标签: java android string split


    【解决方案1】:

    您可以使用正则表达式,例如"\w*="([^"]*(?="))"。这将检查以下内容:

    • \w* 匹配单词字符(如字母和数字),直到
    • = 到达了“=”,它只匹配字符“=”,
    • [^"]* 首先匹配 ^'"' 字符(表示开头的 '"' 字符),然后匹配每个不是 '"' 的字符,直到
    • 到达(?=") 会检查下一个字符是否为 '"' 字符(表示结束的 '"' 字符)

    像这样使用这个正则表达式:myString.replace("\w*="([^"]*(?="))", "\1")。这将用简单的myName 替换整个Name="myName"

    希望对你有帮助

    【讨论】:

    • 感谢 Yato 对此事的见解。但我想我已经找到了解决这个问题的另一种方法,我使用 XMLPullParser 来提取我需要的特定子字符串。
    • 是的,对于其他人(或将来的您自己)来说,这实际上可能比为此使用正则表达式更具可读性。您是否介意在回答您自己的问题时也写下它并接受它,以便其他用户看到您对问题的解决方案是什么? :)
    【解决方案2】:

    首先我创建了一个 DataAttributes 类。

    DataAttributes.java

    public class DataAttributes {
        // declare xml attributes of QR code xml response
        public static final String
                DATA_TAG = "PrintLetterBarcodeData",
                UID_ATTR = "uid",
                NAME_ATTR = "name",
                GENDER_ATTR = "gender",
                GNAME_ATTR = "gname",
                HOUSE_ATTR = "house",
                STREET_ATTR = "street",
                LM_ATTR = "lm",
                LOC_ATTR = "loc",
                VTC_ATTR = "vtc",
                PO_ATTR = "po",
                DIST_ATTR = "dist",
                SUBDIST_ATTR = "subdist",
                STATE_ATTR = "state",
                PC_ATTR = "pc",
                DOB_ATTR = "dob";
    }
    

    二维码被扫描并以字符串形式存储后。

    在您想要显示扫描数据的活动中,在我的例子中是 QRActivity... 所以我在 QRActivity.java 的 QRActivity 类中创建了一个带有单个参数的方法 -> (String scanData)

    里面写了如下代码

        Log.d("QR Code",scanData);
        XmlPullParserFactory pullParserFactory;
    
        try {
            // init the parserfactory
            pullParserFactory = XmlPullParserFactory.newInstance();
            // get the parser
            XmlPullParser parser = pullParserFactory.newPullParser();
    
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            parser.setInput(new StringReader(scanData));
    
            // parse the XML
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if(eventType == XmlPullParser.START_DOCUMENT) {
                    Log.d("QR Code","Start document");
                } else if(eventType == XmlPullParser.START_TAG && DataAttributes.DATA_TAG.equals(parser.getName())) {
                    // extract data from tag
                    //uid
                    uid = parser.getAttributeValue(null,DataAttributes.UID_ATTR);
                    //name
                    name = parser.getAttributeValue(null,DataAttributes.NAME_ATTR);
                    //gender
                    gender = parser.getAttributeValue(null,DataAttributes.GENDER_ATTR);
                    // guardian name
                    gname = parser.getAttributeValue(null,DataAttributes.GNAME_ATTR);
                    // house number
                    house = parser.getAttributeValue(null,DataAttributes.HOUSE_ATTR);
                    // Street name
                    street = parser.getAttributeValue(null,DataAttributes.STREET_ATTR);
                    // landmark
                    lm = parser.getAttributeValue(null,DataAttributes.LM_ATTR);
                    // locality
                    loc = parser.getAttributeValue(null,DataAttributes.LOC_ATTR);
                    // village town city
                    vtc = parser.getAttributeValue(null,DataAttributes.VTC_ATTR);
                    // Post Office
                    po = parser.getAttributeValue(null,DataAttributes.PO_ATTR);
                    // district
                    dist = parser.getAttributeValue(null,DataAttributes.DIST_ATTR);
                    // sub-division
                    subdist = parser.getAttributeValue(null,DataAttributes.SUBDIST_ATTR);
                    // state
                    state = parser.getAttributeValue(null,DataAttributes.STATE_ATTR);
                    // Post Code
                    pc = parser.getAttributeValue(null,DataAttributes.PC_ATTR);
                    // Date of Birth
                    dob = parser.getAttributeValue(null,DataAttributes.DOB_ATTR);
    
    
                } else if(eventType == XmlPullParser.END_TAG) {
                    Log.d("QR Code","End tag "+parser.getName());
    
                } else if(eventType == XmlPullParser.TEXT) {
                    Log.d("QR Code","Text "+parser.getText());
    
                }
                // update eventType
                eventType = parser.next();
            }
    
            // display the data on screen
            String na = "N/A";
    
                if (uid == null){
                            tv_uid.setText(na);
                }else {
                            tv_uid.setText(uid);
                }
    
                if (name == null){
                            tv_name.setText(na);
                }else {
                            tv_name.setText(name);
                }
    
                if (gender == null){
                            tv_gender.setText(na);
                }else {
                            tv_gender.setText(gender);
                }
    
                if (gname == null){
                    tv_gName.setText(na);
                }else {
                    tv_gName.setText(gname);
                }
    
                if (house == null){
                    tv_house.setText(na);
                }else {
                    tv_house.setText(house);
                }
    
                if (street == null){
                    tv_street.setText(na);
                }else {
                    tv_street.setText(street);
                }
    
                if (lm == null){
                    tv_lm.setText(na);
                }else {
                    tv_lm.setText(lm);
                }
    
                if (loc == null){
                    tv_loc.setText(na);
                }else {
                    tv_loc.setText(loc);
                }
    
                if (vtc == null){
                    tv_vtc.setText(na);
                }else {
                    tv_vtc.setText(vtc);
                }
    
                if (po == null){
                    tv_po.setText(na);
                }else {
                    tv_po.setText(po);
                }
    
                if (dist == null){
                    tv_dist.setText(na);
                }else {
                    tv_dist.setText(dist);
                }
    
                if (subdist == null){
                    tv_subdist.setText(na);
                }else {
                    tv_subdist.setText(subdist);
                }
    
                if (state == null){
                    tv_state.setText(na);
                }else {
                    tv_state.setText(state);
                }
    
                if (pc == null){
                    tv_pc.setText(na);
                }else {
                    tv_pc.setText(pc);
                }
    
                if (dob == null){
                    tv_dob.setText(na);
                }else {
                    tv_dob.setText(dob);
                }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    上面的代码是我如何使用 XMLPullParserFactory 将字符串分成适当的片段然后分别显示的示例。

    现在您在 Activity 中使用适合您目的的方法。我刚刚展示了实现 XMLPullParserFactory 来拆分字符串的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多