我有以下字符串:
"hello this.is.a.test(MainActivity.java:47)"
我希望能够提取 MainActivity.java:47 (内容'('和')'内的所有内容,只有第一次出现)。
我尝试使用正则表达式,但似乎我做错了。
由于
答案 0 :(得分:4)
你可以自己做:
int pos1 = str.indexOf('(') + 1;
int pos2 = str.indexOf(')', pos1);
String result = str.substring(pos1, pos2)
或者您可以使用commons-lang,其中包含一个非常好的StringUtils
类substringBetween()
答案 1 :(得分:1)
我认为Regex有点矫枉过正。我会用这样的东西:
String input = "hello this.is.a.test(MainActivity.java:47)";
String output = input.subString(input.lastIndexOf("(") + 1, input.lastIndexOf(")"));
答案 2 :(得分:1)
这应该有效:
^[^\\(]*\\(([^\\)]+)\\)
结果在第一组中。
答案 3 :(得分:1)
您问题的另一个答案:
String str = "hello this.is.a.test(MainActivity.java:47) another.test(MyClass.java:12)";
Pattern p = Pattern.compile("[a-z][\\w]+\\.java:\\d+", Pattern.CASE_INSENSITIVE);
Matcher m=p.matcher(str);
if(m.find()) {
System.out.println(m.group());
}
RegExp解释说:
[a-z][\w]+\.java:\d+
[a-z]>检查我们是否以字母开头......
[\ w] +> ...后跟一个字母,一个数字或一个下划线...
\ .java:> ...紧跟着字符串“.java:”...
\ d +> ...以一个或多个数字结尾
答案 4 :(得分:0)
的伪代码:
int p1 = location of '('
int p2 = location of ')', starting the search from p1
String s = extract string from p1 to p2
答案 5 :(得分:0)
试试这个:
String input = "hello this.is.a.test(MainActivity.java:47) (and some more text)";
Pattern p = Pattern.compile("[^\\)]*\\(([^\\)]*)\\).*");
Matcher m = p.matcher( input );
if(m.matches()) {
System.out.println(m.group( 1 )); //output: MainActivity.java:47
}
如果有更多的文本,它还会在(和)之间找到文本的第一次出现。
请注意,在Java中,您通常会隐式包含^
和$
的表达式(或至少具有相同的效果),即正则表达式必须与整个输入字符串匹配。因此,开头为[^\\)]*
,最后为.*
。