如何获得两个字符之间的string?

我有一个string,

String s = "test string (67)"; 

我想得到(和)之间的stringno 67。

任何人都可以请告诉我如何做到这一点?

有可能是一个真正整洁的RegExp,但我在这方面noob,所以相反…

 String s = "test string (67)"; s = s.substring(s.indexOf("(") + 1); s = s.substring(0, s.indexOf(")")); System.out.println(s); 

像这样尝试

 String s="test string(67)"; String requiredString = s.substring(s.indexOf("(") + 1, s.indexOf(")")); 

子string的方法签名是:

 s.substring(int start, int end); 

通过使用正则expression式:

  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)); 

这个问题的一个非常有用的解决scheme,不需要你做indexOf就是使用Apache Commons库。

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

这个方法甚至可以处理即使有多次出现的closuresstring,通过查找indexOfclosuresstring也不会很容易。

你可以从这里下载这个库: https : //mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

Java支持正则expression式 ,但是如果你真的想用它们来提取匹配的话,它们会很麻烦。 我认为在你的例子中,最简单的方法是在String类的replaceAll方法中使用正则expression式支持:

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

这只是简单地删除了第一个(和之后的)以及之后的所有内容。 这只是在括号之间的东西。

但是,这个结果仍然是一个String 。 如果你想要一个整数结果,而不是你需要做另一个转换:

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

在一行中,我build议:

 String input = "test string (67)"; input = input.subString(input.indexOf("(")+1, input.lastIndexOf(")")); System.out.println(input);` 
 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 

另一种使用拆分方法的方法

 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]); } 

我发现用正则expression式和模式/匹配器类来做到这一点的最普通的方法是:

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

这可能有助于解决更复杂的正则expression式问题,您希望在两组字符之间获取文本。

使用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); } } 
 String result = s.substring(s.indexOf("(") + 1, s.indexOf(")")); 

你可以使用Apache公共库的StringUtils来做到这一点。

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

这样做的“通用”方法是从一开始就parsingstring,扔掉第一个括号之前的所有字符,logging第一个括号之后的字符,并丢弃第二个括号之后的字符。

我确定有一个正则expression式库或者其他的东西。

 String s = "test string (67)"; System.out.println(s.substring(s.indexOf("(")+1,s.indexOf(")"))); 

另一个可能的解决scheme是使用lastIndexOf ,它将从后向查找字符或string。

在我的情况下,我有以下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>> 

我得到了这样的答案。 尝试一下

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