如何获得两个字符之间的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
所以, indexOf
和StringUtils.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]", ""));