यहां बोर्न और पेलाडोल्फो के उत्तरों का एक संयुक्त और संशोधित संस्करण है। यह पहले पूर्ण राज्य नाम को राज्य कोड (कनाडाई प्रांतों के लिए भी काम करता है, और रेगेक्स की तुलना में कम त्रुटि प्रवण होता है) को मानचित्र करने का प्रयास करता है, और यदि यह काम नहीं करता है तो यह रेगेक्स समाधान पर वापस आ जाता है (जिसमें संभावित क्षमता है त्रुटि, इसलिए मैं इसे बैकअप समाधान के रूप में क्यों पसंद करता हूं, लेकिन विभिन्न भाषाओं या देशों के साथ काम कर सकता हूं)।
रेगेक्स समाधान को शुरुआत में एक सैनिटी चेक शामिल करने के लिए सुधार किया गया है, और मैन्युअल रूप से "यूएसए" को फ़िल्टर करने की आवश्यकता को खत्म करने के लिए एक और उन्नत रेगेक्स है (यह कनाडाई पते को काम करने की अनुमति देता है)। यह "टॉपर()" कॉल को भी हटा देता है जिसका "सेंट" ("सड़क" के लिए छोटा) "एसटी" में परिवर्तित करने का साइड इफेक्ट होता है जो झूठा मैच कर सकता है।
(?<![A-Za-z0-9])([A-Z]{2})(?![A-Za-z0-9])
चुनौती यहाँ "संयुक्त राज्य अमेरिका" है वास्तव में "अमेरिका" एक सरल दो पत्र अपर केस खोज से मेल खाना होगा:
import android.location.Address;
import android.util.Log;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StateNameAbbreviator {
private static final String TAG = "StateNameAbbreviator";
static private Map<String, String> mStateMap = null;
static public String getStateAbbreviation(Address address) {
if (address == null) {
return null;
}
populateStates();
String stateCode = mStateMap.get(address.getAdminArea());
if (stateCode == null) {
Log.d(TAG, "State mapping failed, parsing from address");
stateCode = parseStateCodeFromFullAddress(address);
if (stateCode == null) {
Log.d(TAG, "Could not parse state from address");
}
}
else {
Log.d(TAG, "Successfully mapped " + address.getAdminArea() + " to " + stateCode);
}
return stateCode;
}
static private String parseStateCodeFromFullAddress(Address address) {
if ((address == null) || address.getMaxAddressLineIndex() < 0) {
return null;
}
String fullAddress = "";
for(int j = 0; j <= address.getMaxAddressLineIndex(); j++) {
if (address.getAddressLine(j) != null) {
fullAddress += " " + address.getAddressLine(j);
}
}
Log.d(TAG, "Full address: " + fullAddress);
Pattern pattern = Pattern.compile("(?<![A-Za-z0-9])([A-Z]{2})(?![A-Za-z0-9])");
Matcher matcher = pattern.matcher(fullAddress);
String stateCode = null;
while (matcher.find()) {
stateCode = matcher.group().trim();
}
Log.d(TAG, "Parsed statecode: " + stateCode);
return stateCode;
}
private static void populateStates() {
if (mStateMap == null) {
mStateMap = new HashMap<String, String>();
mStateMap.put("Alabama", "AL");
mStateMap.put("Alaska", "AK");
mStateMap.put("Alberta", "AB");
mStateMap.put("American Samoa", "AS");
mStateMap.put("Arizona", "AZ");
mStateMap.put("Arkansas", "AR");
mStateMap.put("Armed Forces (AE)", "AE");
mStateMap.put("Armed Forces Americas", "AA");
mStateMap.put("Armed Forces Pacific", "AP");
mStateMap.put("British Columbia", "BC");
mStateMap.put("California", "CA");
mStateMap.put("Colorado", "CO");
mStateMap.put("Connecticut", "CT");
mStateMap.put("Delaware", "DE");
mStateMap.put("District Of Columbia", "DC");
mStateMap.put("Florida", "FL");
mStateMap.put("Georgia", "GA");
mStateMap.put("Guam", "GU");
mStateMap.put("Hawaii", "HI");
mStateMap.put("Idaho", "ID");
mStateMap.put("Illinois", "IL");
mStateMap.put("Indiana", "IN");
mStateMap.put("Iowa", "IA");
mStateMap.put("Kansas", "KS");
mStateMap.put("Kentucky", "KY");
mStateMap.put("Louisiana", "LA");
mStateMap.put("Maine", "ME");
mStateMap.put("Manitoba", "MB");
mStateMap.put("Maryland", "MD");
mStateMap.put("Massachusetts", "MA");
mStateMap.put("Michigan", "MI");
mStateMap.put("Minnesota", "MN");
mStateMap.put("Mississippi", "MS");
mStateMap.put("Missouri", "MO");
mStateMap.put("Montana", "MT");
mStateMap.put("Nebraska", "NE");
mStateMap.put("Nevada", "NV");
mStateMap.put("New Brunswick", "NB");
mStateMap.put("New Hampshire", "NH");
mStateMap.put("New Jersey", "NJ");
mStateMap.put("New Mexico", "NM");
mStateMap.put("New York", "NY");
mStateMap.put("Newfoundland", "NF");
mStateMap.put("North Carolina", "NC");
mStateMap.put("North Dakota", "ND");
mStateMap.put("Northwest Territories", "NT");
mStateMap.put("Nova Scotia", "NS");
mStateMap.put("Nunavut", "NU");
mStateMap.put("Ohio", "OH");
mStateMap.put("Oklahoma", "OK");
mStateMap.put("Ontario", "ON");
mStateMap.put("Oregon", "OR");
mStateMap.put("Pennsylvania", "PA");
mStateMap.put("Prince Edward Island", "PE");
mStateMap.put("Puerto Rico", "PR");
mStateMap.put("Quebec", "PQ");
mStateMap.put("Rhode Island", "RI");
mStateMap.put("Saskatchewan", "SK");
mStateMap.put("South Carolina", "SC");
mStateMap.put("South Dakota", "SD");
mStateMap.put("Tennessee", "TN");
mStateMap.put("Texas", "TX");
mStateMap.put("Utah", "UT");
mStateMap.put("Vermont", "VT");
mStateMap.put("Virgin Islands", "VI");
mStateMap.put("Virginia", "VA");
mStateMap.put("Washington", "WA");
mStateMap.put("West Virginia", "WV");
mStateMap.put("Wisconsin", "WI");
mStateMap.put("Wyoming", "WY");
mStateMap.put("Yukon Territory", "YT");
}
}
}
regex किसी भी दो पत्र अपरकेस शब्द से मेल खाएगी। तो हम एक अग्रदर्शी और lookbehind की जरूरत है:
?<!
lookbehind मैच मैच के पीछे
(?<![A-Za-z0-9])
देखो, और वहाँ एक अक्षरांकीय चरित्र वहाँ नहीं है यह सुनिश्चित कर लें (यानी, लाइन का एक "शुरू होना चाहिए ", व्हाइटस्पेस, कॉमा, इत्यादि।पहले मैच)
([A-Z]{2})
मैच दो बड़े अक्षरों
?!
मैच के अग्रदर्शी
(?![A-Za-z0-9])
मैच से आगे देखो, और सुनिश्चित करें कि अल्फानुमेरिक चरित्र वहाँ नहीं है (यानी, मिलान के बाद "लाइन का अंत" या व्हाइटस्पेस, कॉमा इत्यादि होना चाहिए)
समस्या जो मैं इस समाधान के साथ देखता हूं वह अंग्रेजी के अलावा अलग-अलग भाषाओं के लिए राज्य का नाम है। – pellyadolfo
अच्छा बिंदु @ पेलियाडोल्फो - अभी तक अमेरिकी राज्य के नामों के लिए अंतर्राष्ट्रीयकरण से निपटना नहीं है, लेकिन क्या आप अतिरिक्त भाषाओं के लिए कुछ तर्क नहीं जोड़ सकते हैं और फिर वांछित भाषा पर आधारित हैशपैप में बस स्वैप कर सकते हैं? – Bourne
हाय @ बॉर्मे, यकीन है कि आप कर सकते हैं, लेकिन मैं इसे एक कठिन उपभोग करने वाला कार्य के रूप में देखता हूं। उदाहरण के लिए अंग्रेजी में न्यू यॉर्क को geocoder द्वारा स्पेनिश में न्यूवे यॉर्क के रूप में वापस कर दिया जाएगा। तो आपको प्रति भाषा एक नया नक्शा चाहिए, जो मुझे लगता है कि मुझे लगता है कि एक लंबा काम है और संभावित रूप से त्रुटि प्रवण है। लेकिन, तकनीकी रूप से, व्यवहार्य है, मैं सहमत हूं। – pellyadolfo