จะแยกชุดของส่วนสตริงที่เฉพาะเจาะจงออกจากสตริงถอดรหัส QR ได้อย่างไร

ฉันต้องเลือกส่วนเฉพาะของสตริงที่มีขนาดใหญ่มาก (ซึ่งกำลังถอดรหัสจากโค้ด QR) เพื่อตั้งเป็นข้อความในองค์ประกอบ TextView ใน Android

//*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);

วิธีที่ฉันดำเนินการนี้จะใช้ได้ก็ต่อเมื่อรูปแบบสตริง QR ที่ถอดรหัสแล้วยังคงเหมือนเดิม กล่าวคือ หากสตริงที่ถอดรหัสแล้วตอนนี้จะเป็นดังนี้:

สตริง string = "uid="001" name="Akbar Shah" sex="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" sex="M" yob="1990" vtc="Alibagh" po="Bagnan" dist="Faridabad" state="Andhra" pc="6754674" วันที่ = "15/04/89"";

หรือเช่นนี้:

String string = "uid="003" name="Anthony Gonzalis" sex="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 ซึ่งอยู่ในเครื่องหมายคำพูดคู่


person Bodhisatwa Chakraborty    schedule 20.04.2017    source แหล่งที่มา


คำตอบ (2)


คุณสามารถใช้ regex ได้ เช่น "\w*="([^"]*(?="))" สิ่งนี้จะตรวจสอบสิ่งต่อไปนี้:

  • \w* จับคู่อักขระคำ (เช่น ตัวอักษรและตัวเลข) จนถึง
  • = ถึง '=' ซึ่งตรงกับอักขระ '='
  • [^"]* จับคู่อักขระ ^'"' ก่อน (ซึ่งแสดงถึงอักขระเปิด '"') จากนั้นจึงจับคู่อักขระทุกตัวที่ไม่ใช่ '"' จนกระทั่ง
  • ถึง (?=") ซึ่งจะตรวจสอบว่าอักขระถัดไปเป็นอักขระ '"' หรือไม่ (ซึ่งแสดงถึงอักขระปิด '"')

ใช้ regex นี้ดังนี้: myString.replace("\w*="([^"]*(?="))", "\1") นั่นจะแทนที่ Name="myName" ทั้งหมดด้วย myName

หวังว่านี่จะช่วยได้

person Yato    schedule 21.04.2017
comment
ขอบคุณ Yato สำหรับข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้ แต่ฉันคิดว่าฉันพบวิธีแก้ไขปัญหาอื่นแล้ว ฉันใช้ XMLPullParser เพื่อแยกสตริงย่อยเฉพาะที่ฉันต้องการ - person Bodhisatwa Chakraborty; 21.04.2017
comment
ใช่ นั่นอาจอ่านได้จริงสำหรับผู้อื่น (หรือตัวคุณเองในอนาคต) มากกว่าการใช้ regex สำหรับสิ่งนี้ คุณช่วยเขียนสิ่งนี้เพื่อตอบคำถามของคุณเองและยอมรับเพื่อให้ผู้ใช้รายอื่นเห็นว่าวิธีแก้ปัญหาของคุณคืออะไร :) - person Yato; 24.04.2017

ก่อนอื่นฉันสร้างคลาส 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";
}

หลังจากที่สแกนโค้ด QR และจัดเก็บไว้ในสตริงแล้ว

ในกิจกรรมของคุณที่คุณต้องการแสดงข้อมูลที่สแกน ในกรณีของฉันคือ QRActivity... ดังนั้นฉันจึงสร้างวิธีการด้วยอาร์กิวเมนต์เดียว -> (String scanData) ในคลาส QRActivity ใน QRActivity.java

ภายในมีการเขียนโค้ดดังนี้

    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 เพื่อแยกสตริงออกเป็นส่วนที่เหมาะสมแล้วแสดงแยกกัน

ตอนนี้คุณใช้วิธีการที่เหมาะสมกับวัตถุประสงค์ของคุณในกิจกรรม ฉันเพิ่งแสดงวิธีการใช้ XMLPullParserFactory เพื่อแยกสตริง

person Bodhisatwa Chakraborty    schedule 03.05.2017