我在hibernate环境中想遍历hibernate.cfg.xml中的所有的类,然后将我想要的某些类的打印出来,我使用正则表达式处理这个过程,但是我在测试的时候发现,这段程序会在matcher.find()这个方法上卡住,然后u后台资源就会占用非常大,而且程序不再往下走,也不报错,这是为什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
publicvoidgetTest() {
List<String> list = getAllClassNameFromModule("privilege");
for(String Str : list) {
System.out.println(Str);
}
}
/**
* 获取所有的类的信息
*
*
@return map<String ,ClassMetadata> String 为类名的全称 ; ClassMetadata为类的信息
*/
privatestaticMap<String, ClassMetadata> getAllClassMetaData() {
returnHibernateUtil.getSessionFactory().getAllClassMetadata();
}
publicstaticList<String> getAllClassNameFromModule(String moduleValue) {
List<String> list =newArrayList<String>();
Map<String, ClassMetadata> map = getAllClassMetaData();
String test ="^(\\w+.)+("+ moduleValue +".){1}(\\w+.)+$";
Pattern pattern = Pattern.compile(test);
Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()) {
String classNam = iterator.next();
Matcher matcher = pattern.matcher(classNam);
if(matcher.find()) {
intindex = matcher.group().lastIndexOf(".");
list.add(matcher.group().substring(index +1));
/* System.out.println(matcher.group().substring(index+1)); */
}
}
returnlist;
} 我测试了一下,发现是以下的原因造成的,matcher.find(),当它要匹配的字符串数量超过五条以上且要匹配的字符串的差别稍微大点,就会造成程序在这个方法上运行很慢(结果会运行数来),那位大神有好的解决办法? |
1.正则效率本来就低,可以考虑换成单独处理的方法,不要正则.
2...你的用法很逗比...都用正则了,为什么还要 lastIndexOf substring....
难道你已经复杂到捕获组也实现不了了?
仅仅通过从配置文件里获取的是实体类的全路径,而我用的时候只需要它的实体类名即可,所以我要切一下,至于你说的那个单独处理的方法是什么方法?楼主你好,我最近也遇到了这个问题,匹配就卡死,你是怎么解决的?
原则上最好别用正则表达式,效率很低。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。