2012-09-26 12 views
47

मैं एक स्ट्रिंग है,दो अक्षर के बीच एक स्ट्रिंग कैसे प्राप्त करें?

String s = "test string (67)"; 

मैं कोई 67 जो बीच स्ट्रिंग है (और) प्राप्त करना चाहते हैं।

क्या कोई मुझे बता सकता है कि यह कैसे करें?

+1

ऐसे कई तरीके हैं - जब तक आप तक पहुँचने आप स्ट्रिंग में वर्ण पुनरावृति '(' या मिल सकता है के सूचकांक पहले '(' और ')' और स्ट्रिंग के साथ यह करना या, ज्यादातर लोगों क्या करेंगे, रेगुलर एक्सप्रेशन का उपयोग –

उत्तर

0

ऐसा करने का "सामान्य" तरीका शुरुआत से स्ट्रिंग को पार्स करना है, पहले ब्रैकेट से पहले सभी पात्रों को फेंकना, पहले ब्रैकेट के बाद वर्णों को रिकॉर्ड करना और दूसरे ब्रैकेट के बाद पात्रों को फेंकना है।

मुझे यकीन है कि एक रेगेक्स लाइब्रेरी है या ऐसा करने के लिए कुछ है।

+0

जावा नियमित अभिव्यक्ति का समर्थन करता है एक regexp4j पुस्तकालय के लिए कोई ज़रूरत नहीं है; की विषमताएं माध्यम से जा रहा बिना) –

61

संभवतः एक बहुत साफ RegExp है, लेकिन मैं उस क्षेत्र में noob हूँ, इसलिए बजाय ...

String s = "test string (67)"; 

s = s.substring(s.indexOf("(") + 1); 
s = s.substring(0, s.indexOf(")")); 

System.out.println(s); 
+2

।। रेगेक्स पार्सिंग, मुझे लगता है कि यह सबसे अच्छा तरीका है आवश्यक स्ट्रिंग निकालें। – verisimilitude

+3

regex कहीं अधिक शक्तिशाली द्वारा और अधिक मामलों में ले जा सकते हैं, लेकिन सादगी के लिए, यह काम करता है ... – MadProgrammer

+1

गंभीरता से, क्यों यह एक नीचे वोट को आकर्षित करेगा? क्या यह काम नहीं करता है? क्या यह ops सवाल का जवाब नहीं देता है? – MadProgrammer

6
String s = "test string (67)"; 

int start = 0; // '(' position in string 
int end = 0; // ')' position in string 
for(int i = 0; i < s.length(); i++) { 
    if(s.charAt(i) == '(') // Looking for '(' position in string 
     start = i; 
    else if(s.charAt(i) == ')') // Looking for ')' position in string 
     end = i; 
} 
String number = s.substring(start+1, end); // you take value between start and end 
+0

क्या आप कोड का संक्षिप्त विवरण शामिल कर सकते हैं? –

+1

@ एनएन। मैंने कोड –

2

एक और विभाजन विधि का उपयोग करने का तरीका

public static void main(String[] args) { 


    String s = "test string (67)"; 
    String[] ss; 
    ss= s.split("\\("); 
    ss = ss[1].split("\\)"); 

    System.out.println(ss[0]); 
} 
12

Java supports Regular Expressions , लेकिन यदि आप वास्तव में मैचों को निकालने के लिए उनका उपयोग करना चाहते हैं तो वे बोझिल हैं। मुझे लगता है कि स्ट्रिंग आप अपने उदाहरण में चाहते हैं पाने के लिए सबसे आसान तरीका है बस String वर्ग के replaceAll विधि में नियमित अभिव्यक्ति समर्थन का उपयोग करने के लिए है:

String x = "test string (67)".replaceAll(".*\\(|\\).*", ""); 
// x is now the String "67" 

यह केवल सब कुछ को हटा देता है अप-टू-एंड-सहित पहले (, और ) और उसके बाद सबकुछ के लिए समान है। यह सिर्फ कोष्ठक के बीच सामान छोड़ देता है।

हालांकि, इसका परिणाम अभी भी String है।

int n = Integer.parseInt(x); 
// n is now the integer 67 
19

रेगुलर एक्सप्रेशन के उपयोग द्वारा:: यदि आप एक पूर्णांक परिणाम चाहते हैं बजाय तो आपको एक और रूपांतरण करने की ज़रूरत

String s = "test string (67)"; 
Pattern p = Pattern.compile("\\(.*?\\)"); 
Matcher m = p.matcher(s); 
if(m.find()) 
    System.out.println(m.group().subSequence(1, m.group().length()-1)); 
+1

के लिए और अधिक टिप्पणियां दीं मुझे लगता है कि आपको इसे "। *?" का उपयोग करके एक गैर लालची मैच बनाना चाहिए। बजाय। अन्यथा, यदि स्ट्रिंग की तरह soemthing है 67) और (68 "परीक्षण स्ट्रिंग (67) और (68), इस" "लौटाएंगे। –

+0

सहमत हूँ। जोड़ा गया"? "। –

2

उपयोग Pattern and Matcher

public class Chk { 

    public static void main(String[] args) { 

     String s = "test string (67)"; 
     ArrayList<String> arL = new ArrayList<String>(); 
     ArrayList<String> inL = new ArrayList<String>(); 

     Pattern pat = Pattern.compile("\\(\\w+\\)"); 
     Matcher mat = pat.matcher(s); 

     while (mat.find()) { 

      arL.add(mat.group()); 
      System.out.println(mat.group()); 

     } 

     for (String sx : arL) { 

      Pattern p = Pattern.compile("(\\w+)"); 
      Matcher m = p.matcher(sx); 

      while (m.find()) { 

       inL.add(m.group()); 
       System.out.println(m.group()); 
      } 
     } 

     System.out.println(inL); 

    } 

} 
+0

चर नाम बोलते हुए विधि अधिक अनुकूल बना सकते हैं। – Zon

41

इस

है जैसे कि यह प्रयास करें
String s="test string(67)"; 
String requiredString = s.substring(s.indexOf("(") + 1, s.indexOf(")")); 

सबस्ट्रिंग के लिए विधि का हस्ताक्षर है:

s.substring(int start, int end); 
+5

सबस्ट्रिंग । कोई CamelCase। – ssayyed

+0

यद्यपि अगर आप की तरह कुछ "परीक्षण) स्ट्रिंग (67)" है एक छोटे से समझा क्या आपके कोड के लिए करता है के द्वारा अपने जवाब बाहर पैड काम नहीं करेगा। – user2871190

-1

मुझे इस तरह का जवाब मिला। यह

String value = "test string (67)"; 
int intValue =Integer.valueOf(value.replaceAll("[^0-9]", "")); 
8

एक पंक्ति में, मैं सुझाव का प्रयास करें:

String input = "test string (67)"; 
input = input.subString(input.indexOf("(")+1, input.lastIndexOf(")")); 
System.out.println(input);` 
0
String s = "test string (67)"; 

System.out.println(s.substring(s.indexOf("(")+1,s.indexOf(")"))); 
1

आप Apache आम लाइब्रेरी की StringUtils इस्तेमाल कर सकते हैं यह करने के लिए।

import org.apache.commons.lang3.StringUtils; 
... 
String s = "test string (67)"; 
s = StringUtils.substringBetween(s, "(", ")"); 
.... 
23

इस मुद्दे है जो आप से indexOf अपाचे कॉमन्स पुस्तकालयों उपयोग कर रहा है करने के लिए की आवश्यकता नहीं है के लिए एक बहुत ही उपयोगी समाधान।

StringUtils.substringBetween(s, "(", ")"); 

इस विधि तुम भी समापन स्ट्रिंग जो indexOf समापन स्ट्रिंग की तलाश द्वारा आसान हो अभ्यस्त की भी वहाँ है, तो अनेक गतिविधियां संभाल की अनुमति देगा।

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

String text = "test string (67)"; 

String START = "\\("; // A literal "(" character in regex 
String END = "\\)"; // A literal ")" character in regex 

// Captures the word(s) between the above two character(s) 
String pattern = START + "(\w+)" + END; 

Pattern pattern = Pattern.compile(pattern); 
Matcher matcher = pattern.matcher(text); 

while(matcher.find()) { 
    System.out.println(matcher.group() 
     .replace(START, "").replace(END, "")); 
} 

यह और अधिक जटिल regex समस्याओं के लिए मदद मिल सकती है: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

2

कम से कम सामान्य तरीके से मैं Regex और पैटर्न/Matcher वर्गों के साथ यह करने के लिए मिल गया जहां आप अक्षर के दो सेट के बीच पाठ प्राप्त करना चाहते हैं।

2
String result = s.substring(s.indexOf("(") + 1, s.indexOf(")")); 
+0

4 स्थानों को इंडेंट करके अपने कोड फ़ॉर्मेट करें। इसके अलावा मैं करूंगा जो लोग इस बात पर अनिश्चित हैं कि '.substring' और .indexOf' क्या है। – Bugs

0

अन्य संभव समाधान lastIndexOf उपयोग करने के लिए जहां यह चरित्र या पीछे से स्ट्रिंग के लिए दिखेगा।

मेरी परिदृश्य में, मैं String निम्नलिखित था और मैं <<UserName>>

1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc 

निकालने के लिए किया था तो, indexOf और StringUtils.substringBetween के रूप में वे शुरू से ही चरित्र की तलाश शुरू सहायक नहीं था।

तो, मैं lastIndexOf

String str = "1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc"; 
String userName = str.substring(str.lastIndexOf("_") + 1, str.lastIndexOf(".")); 

इस्तेमाल किया और, यह मुझे देता है

<<UserName>> 
संबंधित मुद्दे