2012-09-26 122 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>> 
相关问题