正则表达式练习之贴吧实例

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式练习之贴吧实例相关的知识,希望对你有一定的参考价值。

注:以下实例均来自正则表达式贴吧真实需求。

题目:有一组文件格式是AAA-BBB.mp3,要求替换成BBB-AAA.mp3

javascript答案:

var str="AAA-BBB.mp3";
var pattern=/(\\w+?)-(\\w+?)\\.mp3/g;
var s = str.replace(pattern, '$2-$1.mp3');
console.log(s);

Java答案:

public class Demo {
    public static void main(String args[]) {
        String str = "AAA-BBB.mp3";
        String pattern = "(\\\\w+?)-(\\\\w+?)\\\\.mp3";

        Pattern regex = Pattern.compile(pattern);
        Matcher matcher = regex.matcher(str);
        // $2表示第二个分组中的内容;$1表示第一个分组中的内容
        String result = matcher.replaceFirst("$2-$1.mp3");
        System.out.println(result);
    }
}

题目:要求把json字符串{"a"="123", "b"="12c", "c"="abc"}改成这样的格式:{a="123", b="12c", c="abc"}

JavaScript答案:

var str = '{"a"="123", "b"="12c", "c"="abc"}';
var pattern = /\\"([a-zA-Z]+)\\"(?=[=])/g;
var regex = new RegExp(pattern);
var result = str.replace(regex, function (item) {
    return item.replaceAll('\\"', '');
});
console.log(result);

优化:

var str = '{"a"="123", "b"="12c", "c"="abc"}';
var pattern = /\\"([a-zA-Z]+)\\"(?=[=])/g;
var result = str.replace(pattern, '$1');
console.log(result);

Java答案:

public class Demo {
    public static void main(String args[]) {
        String str = "{\\"a\\"=\\"123\\", \\"b\\"=\\"12c\\", \\"c\\"=\\"abc\\"}";
        String pattern = "\\"([a-zA-Z]+)\\"(?=[=])";

        Pattern regex = Pattern.compile(pattern);
        Matcher matcher = regex.matcher(str);
        while (matcher.find()) {
            str = str.replaceAll(matcher.group(), matcher.group().replaceAll("\\"", ""));
        }

        System.out.println(str);
    }
}

优化:

public class Demo {
    public static void main(String args[]) {
        String str = "{\\"a\\"=\\"123\\", \\"b\\"=\\"12c\\", \\"c\\"=\\"abc\\"}";
        String pattern = "\\"([a-zA-Z]+)\\"(?=[=])";

        Pattern regex = Pattern.compile(pattern);
        Matcher matcher = regex.matcher(str);
        String s = matcher.replaceAll("$1");

        System.out.println(s );
    }
}

题目:要求数值范围在[1-10000]之内(并且包含边界)并保留两位小数的正则表达式。

答案:\\b([\\d]{1,4}|10000)\\.[\\d]{1,2}\\b

解释:可以匹配"1.00 56.96 555.11 10000.34 10001.56 123.345"中的"1.00""56.96""555.11""10000.34"。将小数点前面的部分分为两种情况处理:[1-9999]10000,因为10000只需要出现一次。

题目:要求以from开头,以end或over结尾

答案:^from.*?(end|over)$

解释:开头和结尾用^$符号即可,但(end|over)表示字符串"end""over",表示字符串的

题目:要求匹配文本

测试文本:

<span class=\\"pl-c1\\">https</span>:<span class=\\"pl-c1\\">//access.redhat.com/security/cve/cve-2009-0035</span></td>\\n </tr>\\n <tr>\\n <td id=\\"L10\\" class=\\"blob-num js-line-number\\" data-line-number=\\"10\\"/>\\n <td id=\\"LC10\\" class=\\"blob-code blob-code-inner js-file-line\\"><span class=\\"pl-c1\\">5050</span>\\t<span class=\\"pl-c1\\">1</span>\\t<span class=\\"pl-c1\\">2019-11-06T19</span>:<span class=\\"pl-c1\\">15Z</span>\\t<span class=\\"pl-c1\\">CVE-2009-5050</span>\\t<span class=\\"pl-c1\\">konversation \\u306b\\u304a\\u3051\\u308b\\u5165\\u529b\\u78ba\\u8a8d\\u306b\\u95a2\\u3059\\u308b\\u8106\\u5f31\\u6027</span>\\t<span class=\\"pl-c1\\">https</span>:<span class=\\"pl-c1\\">//bugs.kde.org/show_bug.cgi?id=219985</span>

中的超链接,例如:https://bugs.kde.org/show_bug.cgi?id=219985。

答案:<span class=\\\\"pl-c1\\\\">(http[s]?)</span>(:)<span class=\\\\"pl-c1\\\\">(.*?)</span>

解释:然后分别使用分组提取前三组就可以拼接成一个完整的超链接,Java代码如下:

public class Test01 {
    public static void main(String[] args) {
        String html="<span class=\\\\\\"pl-c1\\\\\\">https</span>:<span class=\\\\\\"pl-c1\\\\\\">//access.redhat.com/security/cve/cve-2009-0035</span></td>\\\\n </tr>\\\\n <tr>\\\\n <td id=\\\\\\"L10\\\\\\" class=\\\\\\"blob-num js-line-number\\\\\\" data-line-number=\\\\\\"10\\\\\\"/>\\\\n <td id=\\\\\\"LC10\\\\\\" class=\\\\\\"blob-code blob-code-inner js-file-line\\\\\\"><span class=\\\\\\"pl-c1\\\\\\">5050</span>\\\\t<span class=\\\\\\"pl-c1\\\\\\">1</span>\\\\t<span class=\\\\\\"pl-c1\\\\\\">2019-11-06T19</span>:<span class=\\\\\\"pl-c1\\\\\\">15Z</span>\\\\t<span class=\\\\\\"pl-c1\\\\\\">CVE-2009-5050</span>\\\\t<span class=\\\\\\"pl-c1\\\\\\">konversation \\\\u306b\\\\u304a\\\\u3051\\\\u308b\\\\u5165\\\\u529b\\\\u78ba\\\\u8a8d\\\\u306b\\\\u95a2\\\\u3059\\\\u308b\\\\u8106\\\\u5f31\\\\u6027</span>\\\\t<span class=\\\\\\"pl-c1\\\\\\">https</span>:<span class=\\\\\\"pl-c1\\\\\\">//bugs.kde.org/show_bug.cgi?id=219985</span>";
        Pattern pattern = Pattern.compile("<span class=\\\\\\\\\\"pl-c1\\\\\\\\\\">(http[s]?)</span>(:)<span class=\\\\\\\\\\"pl-c1\\\\\\\\\\">(.*?)</span>");
        Matcher matcher = pattern.matcher(html);
        while (matcher.find()) {
            // https://access.redhat.com/security/cve/cve-2009-0035
            // https://bugs.kde.org/show_bug.cgi?id=219985
            System.out.println(matcher.group(1)+matcher.group(2)+matcher.group(3));
        }
    }
}

题目:有一段文本[123]+[345].[789]*[111].[222].[333],要求取出[345].[789][111].[222]

答案:\\[\\d+\\]\\.\\[\\d+\\]

解释:需要注意[]是元字符,必须进行转义。

题目:验证号码长度是9位还是10位,如果是10位则首字母必须是0。

答案:\\b0?[\\d]{9}\\b

解释:文本如123456789 1234567890 0123456789会匹配第一项和第三项,注意正则表达式中用了边界条件\\b,因为是测试文本是多个字符串,而实际运用中只会有一个字符串,可以去掉边界条件,当然有也不影响。

题目:匹配每个换行符之前最后一个中文符号之后的任意内容。

答案:[^\\u4e00-\\u9fa5]*(?<!\\n)$

解释:注意,使用多行模式,例如匹配

sdfds中文xd123
123中xxx

中的xd123xxx,因为要匹配每一行最后一个中文符号之后换行符之前的任意内容。[\\u4e00-\\u9fa5]是用来匹配中文字符。

题目:以518、918、516、916这四组数字结尾的13位数字。

答案:\\d{10}(518|918|516|916)

解释:还有更好的结果\\d{10}[59]1[68]$

题目:识别字符串中恰好包含三个5的字符串,如a5b5c515552符合要求,而155535这种就不符合要求。

答案:^([^5]*5){3}[^5^\\s]*$

解释:测试的文本如下:

152535
5556
aa5bb5cc5
56575859
155535

题目:要求匹配的字符串中不包含公司

答案:^(?!.*(公司|厂|部)).+$^([^(公司|厂|部)]*)$

解释:测试文本

测试
公司
新东方有限公司
大力加工厂
新闻部
大力出奇迹
公司之力

题目:abababa用aba匹配,实际上出现了三次,写正则表达式来匹配。

答案:(?=aba)

解释:利用断言来实现。

题目:要求匹配一个大于0小于等于24并且最多有两位小数的数字。

答案:^(24(\\.0{1,2})?|(1[0-9]|[1-9]|2[0-3])(\\.\\d{1,2})?|0\\.[1-9][0-9]?|0\\.0[1-9])$

解释:其实是分为了几种情况来讨论:第一种情况,能匹配24或24.0或24.00,那么正则表达式是24(\\.0{1,2})?;第二种情况,能匹配到0.10-0.99,那么正则表达式是0\\.[1-9][0-9]?;第三种情况,能匹配到0.01到0.09,那么正则表达式是0\\.0[1-9];第四种情况:能匹配到20.00到23.99,那么正则表达式是2[0-3](\\.\\d{1,2})?;第五种情况:能匹配到1.00到9.99,那么正则表达式是[1-9](\\.\\d{1,2})?;第六种情况:能匹配到10.00到19.99,那么正则表达式是1[0-9](\\.\\d{1,2})?。注意,都考虑到了小数点不存在、小数只存在一位的情况。

测试文本:

12.23
0
0.0
1.5
1.234
14.56
24.00
24.12
24
20.12
0.25
0.5
11
7
12.
0.01
0.50
1.50

题目:找出一段html文本中最后一个<br />之后的所有内容。

测试文本:

xxxxx<br /><p align="center"></p><p align="center"><br /></p>不管大公司还是小公司,都有可能是一个潜力股。<br />给公司取名给公司加分。<br />所以说公司取名,要重视。

答案:[^>]+$<br />(?!.*?<br)(.*?)$

解释:第一个答案要简洁得多;第二个答案用了断言和分组,还麻烦。

以上是关于正则表达式练习之贴吧实例的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式练习之Regex Golf

实例练习:正则表达式爬取百度贴吧照片

Linux脚本练习之script046-统计文件中仅包含数字的行。

Linux脚本练习之script025-判断用户输入的参数是否为正整数。

Python爬虫学习之正则表达式爬取个人博客

栈练习之Example001-判断一个算术表达式中的括号是否正确配对