加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 正则表达式很慢,如何检查一个字符串是否只有单词字符快

发布时间:2020-12-15 04:11:20 所属栏目:Java 来源:网络整理
导读:我有一个函数检查一个字符串(大多数字符串只有一个CJK字符)只有单词字符,它将被调用很多次,所以成本是不可接受的,但我不知道如何优化它,任何建议? /*w is equivalent to the character class [p{Ll}p{Lu}p{Lt}p{Lo}p{Nd}]. For more details see Unic
我有一个函数检查一个字符串(大多数字符串只有一个CJK字符)只有单词字符,它将被调用很多次,所以成本是不可接受的,但我不知道如何优化它,任何建议?

/*w is equivalent to the character class [p{Ll}p{Lu}p{Lt}p{Lo}p{Nd}].
 For more details see Unicode TR-18,and bear in mind that the set of characters
 in each class can vary between Unicode releases.*/
private static final Pattern sOnlyWordChars = Pattern.compile("w+");

private boolean isOnlyWordChars(String s) {
    return sOnlyWordChars.matcher(s).matches();
}

当s为“3g”或“go_url”或“hao123”时,isOnlyWordChars(s)应该返回true.

解决方法

private boolean isOnlyWordChars(String s) {
    char[] chars = s.toCharArray();    
    for (char c : chars) {
        if(!Character.isLetter(c)) {
            return false;
        }
    }    
    return true;
}

更好的实施

public static boolean isAlpha(String str) {
    if (str == null) {
        return false;
    }
    int sz = str.length();
    for (int i = 0; i < sz; i++) {
        if (Character.isLetter(str.charAt(i)) == false) {
            return false;
        }
    }
    return true;
}

或者,如果您使用的是Apache Commons,StringUtils.isAlpha().答案的第二个实现实际上来自isAlpha的源代码.

UPDATE

对不起,迟到的回复.我不太确定速度,虽然我在几个地方读到循环比正则表达式更快.为了确保我在ideoone中运行以下代码,结果如下

5000000次迭代

使用您的代码:4.99秒(之后的运行时错误,因此对于大数据它不起作用)

用我的第一个代码2.71秒

用我的第二个代码2.52秒

进行500000次迭代

用你的代码:1.07秒

用我的第一个代码0.36秒

用我的第二个代码0.33秒

Here是我使用的示例代码.

注:可能会有小错误.您可以使用它来测试不同的场景.根据Jan的评论,我认为这些是使用私人或公共的小事.条件检查是一个很好的观点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读