Java 判断字符串网址是否合法

public static boolean isTopURL(String str){
        //转换为小写
        str = str.toLowerCase();
        String domainRules = "com.cn|net.cn|org.cn|gov.cn|com.hk|公司|中国|网络|com|net|org|int|edu|gov|mil|arpa|Asia|biz|info|name|pro|coop|aero|museum|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cf|cg|ch|ci|ck|cl|cm|cn|co|cq|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|es|et|ev|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gp|gr|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|ml|mm|mn|mo|mp|mq|mr|ms|mt|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|va|vc|ve|vg|vn|vu|wf|ws|ye|yu|za|zm|zr|zw";
        String regex = "^((https|http|ftp|rtsp|mms)?://)"
                + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
                //+ "(([0-9]{1,3}\\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
                + "|" // 允许IP和DOMAIN(域名)
                + "(([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]+\\.)?" // 域名- www.
                + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\." // 二级域名
                + "("+domainRules+")" // ) first level domain- .com or .museum
                + "(:[0-9]{1,4})?" // 端口- :80
                + "((/?)|" // a slash isn't required if there is no file name
                + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
        Pattern pattern = Pattern.compile(regex);
        Matcher isUrl = pattern.matcher(str);

        return isUrl.matches();
    }

### 使用 `SimpleDateFormat` 校验日期格式并设置严格模式 在 Java 中,判断字符串是否合法的日期格式,最常用的方式是使用 `SimpleDateFormat` 类结合 `parse()` 方法进行解析。为了确保校验的准确性,需要将 `setLenient(false)` 设置为严格模式,以防止类似 `2007-02-29` 这样的非法日期被宽松接受[^1]。 示例代码如下: ```java import java.text.ParseException; import java.text.SimpleDateFormat; public class DateValidator { public static boolean isValidDate(String str) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); format.setLenient(false); // 设置为严格模式 try { format.parse(str); return true; } catch (ParseException e) { return false; } } } ``` 该方法可以有效验证标准格式 `yyyy-MM-dd` 的日期字符串,如 `2023-04-05` 会被接受,而 `2023-02-30` 则会抛出异常并返回 `false` [^1]。 ### 增加对年份格式的额外校验 尽管 `SimpleDateFormat` 在严格模式下能处理大部分合法日期格式,但仍存在一些边界情况无法覆盖。例如,像 `0001-01-01` 或 `10000-01-01` 这样的年份虽然格式上符合 `yyyy-MM-dd`,但在实际业务中可能被视为不合法。因此,可以在解析成功后进一步校验年份部分是否符合预期规则,例如年份不能以 `0` 开头且必须为四位数[^3]。 扩展后的校验逻辑如下: ```java public static boolean isValidDateWithYearCheck(String dateStr) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); format.setLenient(false); try { format.parse(dateStr); } catch (Exception e) { return false; } String yearStr = dateStr.split("-")[0]; if (yearStr.startsWith("0") || yearStr.length() != 4) { return false; } return true; } ``` 此方式增强了对输入数据的控制能力,适用于金融、医疗等对时间格式有更高要求的场景[^3]。 ### 结合正则表达式预校验提升效率 为了进一步优化性能,可以在调用 `SimpleDateFormat` 之前使用正则表达式对输入字符串进行初步筛选,提前过滤掉明显不符合格式的字符串。例如,针对 `yyyy-MM-dd` 格式,可以使用如下正则表达式: ```java String regex = "^\\d{4}-\\d{2}-\\d{2}$"; if (!dateStr.matches(regex)) { return false; } ``` 这种方式减少了不必要的 `SimpleDateFormat` 解析操作,从而提升整体效率[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值