स्ट्रिंग के आकार की परवाह किए बिना जावा में एक स्ट्रिंग में अंतिम वर्ण कैसे प्राप्त करें


80

मैं आकार की परवाह किए बिना एक स्ट्रिंग से अंतिम पात्रों को खींचने का एक तरीका ढूंढ रहा हूं। इन तारों को उदाहरण में लें:

"abcd: efg: 1006746"
"bhddy: nshhf36: 1006754"
"hfquv: nd: 5894254"

जैसा कि आप देख सकते हैं, पूरी तरह से यादृच्छिक स्ट्रिंग्स, लेकिन उनके पास अंत में 7 नंबर हैं। मैं उन 7 नंबरों को कैसे ले पाऊंगा?

संपादित करें:

मुझे बस एहसास हुआ कि String[] string = s.split(": ");यहाँ बहुत अच्छा काम होगा, जब तक कि मैं संख्याओं के लिए स्ट्रिंग [2] और बीच में किसी भी चीज के लिए स्ट्रिंग [1] कहूं।


आपके प्रश्न और कई उत्तर दोनों का उल्लेख है String.split(), लेकिन यह ध्यान देने योग्य है कि हर बार जब आप इसे कहते हैं, तो s.split(": ")एक नया संकलन करने जा रहा है java.uitl.regex.Pattern, फिर उस पैटर्न के साथ अपने स्ट्रिंग का मिलान करें, एक regex Matcherऔर ArrayListइससे पहले String[]कि वह वापस आ जाए। यह अपेक्षाकृत धीमा होगा और इस समस्या को हल करने के लिए आवश्यकता से कहीं अधिक आवंटित करेगा। क्या यह मामला आपके आवेदन की प्रकृति पर निर्भर करता है। मैं आमतौर पर split()तब तक बचता हूं जब तक मुझे वास्तव में इसकी आवश्यकता नहीं है। (ध्यान दें कि split()है नहीं regex का उपयोग करता है, तो आप एक ही चरित्र पर अलग हो गए।)
rjb1290

जवाबों:


104

बहुत सारी चीजें जो आप कर सकते थे।

s.substring(s.lastIndexOf(':') + 1);

पिछले बृहदान्त्र के बाद सब कुछ मिल जाएगा।

s.substring(s.lastIndexOf(' ') + 1);

अंतिम स्थान के बाद सब कुछ।

String numbers[] = s.split("[^0-9]+");

अंकों के सभी अनुक्रमों को विभाजित करता है; संख्या सरणी का अंतिम तत्व संभवतः वही है जो आप चाहते हैं।


4
lastIndexOfदृष्टिकोण का एक गंभीर पहलू यह है कि यदि कोई स्थान नहीं हैlastIndexOf , तो -1 वापस आ जाएगा, इसलिए आप पूरे स्ट्रिंग के साथ समाप्त हो जाएंगे ( s.substring(0))।
जॉन स्कीट

s.substring (s.lastIndexOf (':') + 1); मैं इसका उपयोग करना चाहूंगा, लेकिन मैं पहले बृहदान्त्र के बाद पत्र कैसे प्राप्त कर पाऊंगा? क्या यह s.indexOf (":", 1) नहीं होगा?
प्यूप्पीकेविन

144

कैसा रहेगा:

String numbers = text.substring(text.length() - 7);

यह मानता है कि अंत में 7 वर्ण हैं । यदि आप इसे "12345" पास करते हैं तो यह एक अपवाद फेंक देगा। आप इस तरह से संबोधित कर सकते हैं:

String numbers = text.substring(Math.max(0, text.length() - 7));

या

String numbers = text.length() <= 7 ? text : text.substring(text.length() - 7);

ध्यान दें कि यह अभी भी कोई सत्यापन नहीं कर रहा है कि परिणामी स्ट्रिंग में संख्याएं हैं - और यह अभी भी एक अपवाद फेंक देगा यदि textअशक्त है।


54

यह सवाल "जावा स्ट्रिंग राइट" के लिए शीर्ष Google परिणाम है।

हैरानी की बात है, कोई भी अभी तक अपाचे कॉमन्स StringUtils.right () का उल्लेख किया है :

String numbers = org.apache.commons.lang.StringUtils.right( text, 7 );

यह उस मामले को भी संभालता है जहां textअशक्त है, जहां कई अन्य उत्तर NullPointerException को फेंक देंगे।


1
मुझे भी आश्चर्य होता है। यह तरीका सभी संभावित समस्याओं को संभालने की तुलना में बहुत अधिक सुरक्षित है।
जारोस्लाव कुबोस

यह एकमात्र उत्तर भी है जो काम करता है यदि आप चाहते हैं / किसी एकल अभिव्यक्ति को सुरक्षित रूप से किसी स्ट्रिंग में बदलने और अंतिम nवर्णों तक पहुंचने की आवश्यकता हो । उदाहरण के लिए, आप कर सकते हैं StringUtils.right(Objects.toString(someObj), 7)
rjb1290

23

यह कोड मेरे लिए पूरी तरह से काम करता है:

String numbers = text.substring(Math.max(0, text.length() - 7));

7

आप इस एकल लाइन कोड का उपयोग करके इसे प्राप्त कर सकते हैं :

String numbers = text.substring(text.length() - 7, text.length());

लेकिन इनपुट स्ट्रिंग की लंबाई 7 से कम होने पर अपवाद को पकड़ना सुनिश्चित करें

यदि आप अंतिम 'एन' वर्ण प्राप्त करना चाहते हैं, तो आप 7 को किसी भी संख्या के एन कह सकते हैं।


1
अग्रिम में जांच करना बेहतर है कि इनपुट लंबाई 7 या अधिक है, और फिर सबस्ट्रिंग करें।
orique

4

मैं String.splitया तो रेगीक्स का उपयोग करूंगा :


String.split का उपयोग करना

String[] numberSplit = yourString.split(":") ; 
String numbers = numberSplit[ (numberSplit.length-1) ] ; //!! last array element

RegEx का उपयोग करना (आवश्यकता है import java.util.regex.*)

String numbers = "" ;
Matcher numberMatcher = Pattern.compile("[0-9]{7}").matcher(yourString) ;
    if( matcher.find() ) {
            numbers = matcher.group(0) ;
    } 

2
रेगेक्स [0-9]{7}$यह सुनिश्चित करने के लिए होना चाहिए कि यह अंतिम 7 अंकों से मेल खाता है ।
व्हिस्कीसिएर

@ विली शोनबोर्न: सहमत। ओपी के मामले ने सुझाव दिया कि स्ट्रिंग में अन्य समूहों में हमेशा पत्र होंगे। मैं मान रहा था कि एक सीमा निर्दिष्ट करना अनावश्यक था।
FK82

2
String inputstr = "abcd: efg: 1006746"
int startindex = inputstr.length() - 10;
String outputtendigitstr = inputstr.substring(startindex);

सुनिश्चित करें कि आप स्ट्रिंग की लंबाई 10 से अधिक है।



1

StringUtils.substringAfterLast ("abcd: efg: 1006746", ":") = "1006746";

जब तक स्ट्रिंग का प्रारूप तय नहीं हो जाता तब तक आप substringAfterLast का उपयोग कर सकते हैं ।



0

जैसे: "abcd: efg: 1006746" "bhddy: nshhf36: 1006754" "hfquv: nd: 5894254"

-चरण 1: String firstString = "abcd: efg: 1006746";

-चरण 2: String lastSevenNumber = firstString.substring(firstString.lastIndexOf(':'), firstString.length()).trim();

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.