2012-09-26 167 views
47

我有一個字符串,如何獲得兩個字符之間的字符串?

String s = "test string (67)"; 

我希望得到67號這之間的字符串(和)。

任何人都可以請告訴我如何做到這一點?

+1

有幾種方法 - 直到你到達你可以遍歷字符的字符串中的'('或找到第一個'('和')'的索引,並且用子字符串或者大多數人會做的事情使用正則表達式。 –

回答

0

這樣做的「通用」方法是從開始解析字符串,在第一個括號之前丟棄所有字符,在第一個括號之後記錄字符,並在第二個括號之後丟棄字符。

我確定有一個正則表達式庫或者其他的東西。

+0

Java支持正則表達式,不需要regexp4j庫;) –

61

有可能是一個非常整潔的正則表達式,但我在這方面的小白,所以不是...

String s = "test string (67)"; 

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

System.out.println(s); 
+2

沒有經歷過奇怪的正則表達式解析,我認爲這是最好的方式提取所需的字符串。 – verisimilitude

+3

正則表達式更強大,可以採取更多的情況下,但爲簡單起見,這項工作... – MadProgrammer

+1

嚴重的是,爲什麼這會吸引投票?它不起作用嗎?它不回答操作問題嗎? – 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

@ N.N。我對代碼 –

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

給出了更多評論我認爲你應該通過使用「。*?」使其成爲非貪婪的匹配。代替。否則,如果字符串類似「測試字符串(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

子字符串。如果你有類似「test」字符串(67)的東西, – ssayyed

+0

不會工作。 – 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收盤字符串容易多次出現。

你可以從這裏下載這個庫: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

2

最低通用的方式,我發現做到這一點與正則表達式和模式/匹配器類:

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, "")); 
} 

這可能有助於爲更復雜的正則表達式的問題您想在兩組字符之間獲取文本。

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 

所以,indexOfStringUtils.substringBetween是不是有益,因爲它們開始尋找從起始符。

所以,我用lastIndexOf

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

而且,它給了我

<<UserName>> 
相關問題