我有以下字符串:

"hello this.is.a.test(MainActivity.java:47)"

而且我希望能够提取MainActivity.java:47

("("和")"内的所有内容,只有第一次出现)。

我尝试使用正则表达式,但似乎做错了什么。

谢谢

您尝试了什么正则表达式?

可能的stackoverflow.com/questions/4749549/和stackoverflow.com/questions/4662215/

您是否特别需要使用正则表达式,或者任何工作方法都足够?

任何方法都可以

看起来您正在尝试解析stacktrace。 它来自文本文件,还是您可以访问正在创建的Exception对象?

你可以自己做:

int pos1 = str.indexOf('(') + 1;
int pos2 = str.indexOf(')', pos1);
String result = str.substring(pos1, pos2)

或者,您可以使用commons-lang,它包含一个非常漂亮的StringUtils类,该类具有substringBetween()

我认为您需要用int pos1 = str.indexOf(() + 1;替换行:int pos1 = str.lastIndexOf(() + 1;。 OP只希望第一次出现。

@Toader:也许吧。 Ive赞成您的评论,以使其更加突出。这样,OP可以决定他的需求。

谢谢..这就是他说的:"而且只有第一次出现。"

您问题的另一个答案:

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解释:

<5233>

[a-z]>检查我们是否以字母开头...

[ w] +> ...后跟字母,数字或下划线...

.java:> ...后面紧跟字符串" .java:" ...

d +> ...以一位或多位数字结尾

这应该工作:

^[^\\(]*\\(([^\\)]+)\\)

结果在第一组中。

当然可以使用正则表达式来实现,但是当它看起来像那样时,为什么还要麻烦呢?

实际上,实际的正则表达式要简单得多:)。我只是对其进行了复杂处理,以确保其能够按预期工作:)。这也将起作用:\\((.+?)\\)

困扰正则表达式的两个原因:" lastIndexOf"方法将对字符串的char进行两次迭代(一次用于"(",一次用于")"),而一个好的regex实现将仅对char进行一次迭代(两次) ,在最坏的情况下,取决于输出)。第二个是您可能不平衡()。在OP的特殊情况下,它们是平衡的,所以我的第二点是没有意义的。

@Soronthar那是真的:)。

...,并且加倍的反斜杠不是regexp的一部分,只有Java String文字才需要。

我认为Regex有点过分。我会用这样的东西:

String input ="hello this.is.a.test(MainActivity.java:47)";
String output = input.subString(input.lastIndexOf("(") + 1, input.lastIndexOf(")"));

尝试这个:

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中,通常会将表达式用^和$隐式包装(或至少具有相同的效果),即正则表达式必须与整个输入字符串匹配。因此,必须在开头[^\\)]*,在结尾.*。

伪代码:

int p1 = location of '('
int p2 = location of ')', starting the search from p1
String s = extract string from p1 to p2
String.indexOf()和String.substring()是您的朋友。