java 正则 子字符串,关于正则表达式:提取Java中的子字符串

我有以下字符串:

"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()是您的朋友。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值