宁武皇仁光九年锦文轩刻本《异闻录》载: 扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。 其时正武德之乱,潘镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。 是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。 溪始觉如梦,奔塘边,但见池水干涸,莲叶皆枯,塘中鲤亦不知所踪。 自始至终,未辨眉目,只记襟上层迭莲华,其色魅惑,似血着泪。 后有青岩居士闻之,叹曰:魑祟动情,必作灰飞。犹蛾之投火耳,非愚,乃命数也。 ————《锦鲤抄》

【java 中用 split 根据逗号分割字符串及正则表达式拓展】

 

正则表达式可用于解析,判断字符串格式内容。

 

demo里有两个例子,第一个例子是解析一个长字符串,其中包括多个字段,有字符串类型和整型,可以根据正则表达式去按逗号分割字段,且不会把字符串类型双引号中的 逗号 计入,适用于摘要这种字段。

第二个例子是邮箱格式的验证,可以简单了解正则表达式的使用。

代码如下:

  @Test
    public void regularExp() {
        // 正则表达式学习

        // 1、逗号分割时不计入字符串字段内的逗号,如摘要中的逗号
        // String line = "\"缴纳投标保障金,需用惠州公司基本账户,汇款时需注明汇款用途为“E19138的磋商保证金,银行开具的汇款单盖章原件由磋商供应商留存,作为保证金收取依据”\"        ,DN02,\"公诚管理咨询有限公司\"";
        String line = "    \"一个有想法的字符串\", 10086, \"编号为123 ,测试歌曲是:”小星星“,会员限定欣赏\"     ";
        //  List<String> colsValue = Arrays.asList(line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1));
        List<String> colsValue = Arrays.asList(line.split("(?!\"),(?!\")", -1));
        /**
         * 其中 ?: 是非捕获元之一,还有两种非捕获元是 ?= 和 ?!,(非捕获元会忽略对相关匹配的保存,这样可以减少内存占用)
         * 这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,
         * 后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
         *  假想情景: str = "   "xxx",编号为123 ,"测试歌曲是:”小星星 “,会员限定欣赏"   "
         *  解析:     ?!理解为不匹配条件即可
          * 效果:不会匹配双引号内的逗号
         */
        for (int x = 0; x < colsValue.size(); x++) {
            System.out.println(colsValue.get(x));
        }
        System.out.println("===以上为逗号分割===");
        System.out.println("\n");


// 2、判断Email地址是否合法 String email1 = "1486991950@qq.com"; String email2 = "@qq.com"; String email3 = "234af--j@qq.com"; String email4 = "2344@q44.com"; String email5 = "235435.com"; String email6 = "124345324@.com"; String rule = "^\\w+([-+.]\\w+)*@\\w+([.]com)*$"; /** * 按表达式排列顺序简单解释下: * ^ 开始匹配 * ^\ 和 $ 分别指字符串的开始与结束 ,+ 号代表前面的字符必须至少出现一次(1次或多次)。 * \w 表示匹配字母、数字、下划线。等价于 [A-Za-z0-9_] ,这里有两个\\是因为idea粘贴字符串会自动转义 * ([-+.]\w+) 意思是-+. 这三个字符参加匹配(但是只能有一位字符,++这样是不行的),其字符后再加上数字若干 * ([-+.]\w+)* 多了个*,表示[]* 所代表的内容出现次数不固定,为 ≥0 次 * @\w+([.]com)* 原理同上: @qq3.com * $ 结束匹配 */ List<String> str = new ArrayList<>(); str.add(email1); str.add(email2); str.add(email3); str.add(email4); str.add(email5); str.add(email6); Pattern pattern; Matcher matcher; for(int i = 0; i<str.size(); i++) { pattern = Pattern.compile(rule); matcher = pattern.matcher(str.get(i)); if (matcher.matches()) System.out.println(str.get(i) + " 合法"); else System.out.println(str.get(i) + " 不合法"); } System.out.println("===以上为email分割==="); System.out.println("\n"); }

 

输出如下:


"一个有想法的字符串"
10086
"编号为123 ,测试歌曲是:”小星星“,会员限定欣赏"
===以上为逗号分割===




1486991950@qq.com 合法
@qq.com 不合法
234af--j@qq.com 不合法
2344@q44.com 合法
124345324@.com 不合法
235435.com 不合法
===以上为email分割===

 

PS:附上一些其他正则表达式规则:

%表示在所在行中进行处理,s表示查找、替换功能, 格式是:s/查找的内容/替换的内容/选项, *表示查找0个或者多个空格, g表示全部替换
对于任意字符的匹配,建议使用中括号来限制:
[a-z] // 匹配所有的小写字母 
[A-Z] // 匹配所有的大写字母 
[a-zA-Z] // 匹配所有的字母 
[0-9] // 匹配所有的数字  ^[0-9]*$
[0-9\.\-] // 匹配所有的数字,句号和减号 
[ \f\r\t\n] // 匹配所有的白字符


正则表达式学习链接:
https://www.runoob.com/regexp/regexp-syntax.html
posted @ 2022-02-28 11:24  哒布溜  阅读(2730)  评论(0编辑  收藏  举报