जावा में एक चरित्र c तक स्ट्रिंग से सबस्टिट्यूट कैसे प्राप्त करें?


101

मेरे पास एक स्ट्रिंग है (जो मूल रूप से एक नामकरण सम्मेलन के बाद एक फ़ाइल नाम है) abc.def.ghi

मैं पहले .(यानी एक डॉट) से पहले सबस्ट्रिंग निकालना चाहूंगा

जावा डॉक्टर एपी में, मैं स्ट्रिंग में एक विधि नहीं ढूंढ सकता हूं जो ऐसा करता है।
क्या मैं कुछ भूल रहा हूँ? यह कैसे करना है?

जवाबों:


65

String.indexOfऔर देखो String.substring

सुनिश्चित करें कि आप -1 के लिए जाँच करें indexOf


1
छोटा एवं सुन्दर। यह भी याद रखें कि indexOf प्रतिस्थापन के पहले सूचकांक देता है।
नील चौधरी

112

स्वीकृत उत्तर सही है, लेकिन यह आपको यह नहीं बताता कि इसका उपयोग कैसे करें। यह है कि आप एक साथ indexOf और सबस्ट्रिंग फ़ंक्शन का उपयोग कैसे करते हैं।

String filename = "abc.def.ghi";     // full file name
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
//So check and account for it.

String subString;
if (iend != -1) 
{
    subString= filename.substring(0 , iend); //this will give abc
}

1
यह अमान्य कोड है क्योंकि आप ब्रेसिज़ के बिना एक इफ स्टेटमेंट के शरीर में एक चर घोषणा नहीं कर सकते।
1937

84

आप सिर्फ स्ट्रिंग विभाजित कर सकते हैं ।

public String[] split(String regex)

ध्यान दें कि java.lang.String.split सीमांकक के नियमित अभिव्यक्ति मूल्य का उपयोग करता है। मूल रूप से इस तरह ...

String filename = "abc.def.ghi";     // full file name
String[] parts = filename.split("\\."); // String array, each element is text between dots

String beforeFirstDot = parts[0];    // Text before the first dot

बेशक, यह क्लैरिटी के लिए कई लाइनों में विभाजित है। इसे इस प्रकार लिखा जा सकता है

String beforeFirstDot = filename.split("\\.")[0];

5
आपका प्रस्ताव सही नहीं है, क्योंकि java.lang.String.split केवल स्ट्रिंग नहीं, बल्कि विशेषता के रूप में regex मान लेता है। सब "।" आपके उदाहरण में "\\" को बदलना होगा। फिर यह काम करेगा :)
एरिक काजु

2
मुझे रेगेक्स बहुत पसंद है, लेकिन यह मुझे हर बार मिलता है।
चाड शाउगिन्स

70

यदि आपकी परियोजना पहले से ही कॉमन्स-लैंग का उपयोग करती है , तो स्ट्रिंगटीलिल्स इस उद्देश्य के लिए एक अच्छा तरीका प्रदान करते हैं:

String filename = "abc.def.ghi";

String start = StringUtils.substringBefore(filename, "."); // returns "abc"

javadoc [2.6] [3.1] देखें


अन्य समाधानों की तुलना में क्लीनर।
userab

12

या आप कुछ इस तरह की कोशिश कर सकते हैं

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);


3
'c' का क्रैश स्ट्रिंग में नहीं होगा क्योंकि indexOf -1 वापस आएगा
टोफूबीर

@ उमर हयात क्या है अगर फ़ाइल नाम है def.hij.klm? तब आपका कोड कैसे काम करेगा? (आपका कोड केवल इस एक उदाहरण के लिए काम करता है - आप एक ऐसा फ़ंक्शन लिख सकते हैं जो रिटर्न करता है "abc"- यह भी ठीक काम करेगा)
बोहेमियन

@ बोहेमियन: मुझे पता है कि सीमा के मामले और चेक गायब हैं। यह विशिष्ट प्रश्न का एक उत्तर था और एक विचार के माध्यम से सामान्य विचार देना था :)।
उमेर हयात

1
@TofuBeer: ठीक है, पहले एक भ्रम है "(यानी एक डॉट)" वास्तविक पोस्ट में नहीं था। मुझे लगता है और उम्मीद है कि मेरा जवाब समस्या के इस परिजन को हल करने के लिए एक सामान्य विचार देता है।
उमर हयात

2
मैं साथ जाऊँगा: int ix = inString.indexOf ('।'); if (ix> -1) inString = inString.substring (0, ix); मुझे नहीं पता कि उमर ने सबट्रेक्टिंग का सुझाव क्यों दिया था 1. सबस्ट्रिंग का दूसरा तर्क अप करने के लिए है, लेकिन वैसे भी बाहर करना।
मीका बर्गर

4

रेगेक्स का उपयोग कैसे करें?

String firstWord = filename.replaceAll("\\..*","")

यह पहले डॉट से अंत तक "" के साथ सब कुछ बदल देता है (यानी यह इसे साफ करता है, जो आप चाहते हैं उसे छोड़कर)

यहाँ एक परीक्षण है:

System.out.println("abc.def.hij".replaceAll("\\..*", "");

आउटपुट:

abc

7
मैं नीचा नहीं था, (और मैं मानता हूँ कि यह बेकार है जब लोग बिना किसी कारण के नीचे जाते हैं) लेकिन आपका समाधान बहुत महंगा है और सुपर स्पष्ट नहीं है।
टोफूबीर

1
@ घुमंतू-नोगिंस मैं इसका वर्णन कर सकता हूं, यदि आप चाहते हैं कि मैं चाहता हूं कि मैं भी ऐसा कर सकता हूं ... लेकिन यह निश्चित नहीं है कि मैं इसे एक टिप्पणी में कैसे कर सकता हूं (शायद एक और प्रश्न / उत्तर देना होगा)। यह महंगा है क्योंकि यह सभी पात्रों को बदलने के साथ-साथ एक नया स्ट्रिंग बनाता है। सबस्ट्रिंग बस स्ट्रिंग में एक दृश्य देता है। इस सहायता?
टोफूबीर

2
@ टोफूबीर आप गलत हैं। तार अपरिवर्तनीय हैं । सबस्ट्रिंग एक दृश्य नहीं लौटाता है। स्ट्रिंग पद्धति से लौटाया गया प्रत्येक स्ट्रिंग एक नया स्ट्रिंग है।
बोहेमियन

@ Knickerless-Noggins वह गलत है ... हाल की टिप्पणियाँ देखें। इसके अलावा, यह पर्याप्त है। कोड का घनत्व अधिक है - इसे "प्रदर्शन" के लिए अधिक कोड जोड़ने का औचित्य साबित करने के लिए तीव्रता से उपयोग करना होगा।
बोहेमियन

यह जाहिरा तौर पर JDK 7, javarevisited.blogspot.ca/2011/10/…
TofuBeer

2

Java.lang.String में आपको indexOf () जैसे कुछ तरीके मिलते हैं: जो आपको पहली बार किसी char / string का index देता है। और lstIndexOf: जो आपको String / char का आखिरी इंडेक्स देता है

जावा डॉक्टर से:

  public int indexOf(int ch)
  public int indexOf(String str)

निर्दिष्ट वर्ण की पहली घटना के इस स्ट्रिंग के भीतर सूचकांक लौटाता है ।


2

यहाँ वह कोड है जो Stringकिसी वर्ण की दी गई सूची के किसी भी समय तक एक विकल्प देता है :

/**
 * Return a substring of the given original string until the first appearance
 * of any of the given characters.
 * <p>
 * e.g. Original "ab&cd-ef&gh"
 * 1. Separators {'&', '-'}
 * Result: "ab"
 * 2. Separators {'~', '-'}
 * Result: "ab&cd"
 * 3. Separators {'~', '='}
 * Result: "ab&cd-ef&gh"
 *
 * @param original   the original string
 * @param characters the separators until the substring to be considered
 * @return the substring or the original string of no separator exists
 */
public static String substringFirstOf(String original, List<Character> characters) {
    return characters.stream()
            .map(original::indexOf)
            .filter(min -> min > 0)
            .reduce(Integer::min)
            .map(position -> original.substring(0, position))
            .orElse(original);
}

1

यह मदद कर सकता है:

public static String getCorporateID(String fileName) {

    String corporateId = null;

    try {
        corporateId = fileName.substring(0, fileName.indexOf("_"));
        // System.out.println(new Date() + ": " + "Corporate:
        // "+corporateId);
        return corporateId;
    } catch (Exception e) {
        corporateId = null;
        e.printStackTrace();
    }

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