java正则表达式提取字符串的问题

carlos175 2010-08-24 01:58:19

public static void main(String[] args) {
String source = "first {test} is here,two {test2} is here!";
String find = "\\u007B.*\\u007D";
Pattern pattern = Pattern.compile(find);
Matcher matcher = pattern.matcher(source);
while(matcher.find()) {
System.out.println(matcher.group());
}
}


我要实现的是将{test}和{test2}提取出来。但是用

String find = "\\u007B.*\\u007D";

获取出来的是
{test} is here,two {test2}
貌似获取的是第一个{和最后一个}。我怎么能用正则去提取每一对{}的呢?
因为这个字符串的内容不是固定的。所以无法使用类似下面的方式解决:

String input = "first {test} is here,two {test2} is here!";
Scanner scanner = new Scanner (input);
scanner.findInLine ("first (.+) is here,two (.+) is here!");
MatchResult result = scanner.match();

...全文
476 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
huntor 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huntor 的回复:]

Java code
(\\{^\\}+\\})
[/Quote]
\\{[^\\}]+\\}

只要中间的匹配非}即可,而不是使用 . 匹配
carlos175 2010-08-24
  • 打赏
  • 举报
回复
谢谢楼上几位的回答~刚才去google了一把看了看~确实是如3楼的兄弟所说~是一个贪婪匹配的概念。
这次的这个问题让我深刻的体会到学习正则表达式的一个重要性了!
谢谢楼上兄弟们的帮助!
zhaolinger2 2010-08-24
  • 打赏
  • 举报
回复
如果你要取得每个括号内的值(不含括号),可以用下面的表达式:

"(?<=\\u007B).*?(?=\\u007D)"

去搜索一下“预匹配”,希望能帮到你。
huntor 2010-08-24
  • 打赏
  • 举报
回复
	String find = "\\{.*?\\}"; 
zhaolinger2 2010-08-24
  • 打赏
  • 举报
回复
普及一下“非贪婪匹配”的知识。
一般情况下我们做的都是贪婪匹配,即能匹配到的最长的字符串。也就是你现在遇到的问题,把第一个左括号和第二个右括号中的大段匹配出来。
而这个时候需要用到非贪婪匹配,也就是,从左到右匹配,只要遇到符合要求的字符串,无论它是否是最长的,都把它拿出来当做匹配结果。
使用方法是在表示多个匹配的通配符,如*,+,{m,n}之后加上一个问号?,就能实现了。
zhaolinger2 2010-08-24
  • 打赏
  • 举报
回复
"\\u007B.*?\\u007D";
huntor 2010-08-24
  • 打赏
  • 举报
回复
(\\{^\\}+\\})

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧