刚才看到个帖子:
如下:去掉[zz] [/zz]中间的字符
当然,[zz]是可以自定义的。可以换成[xieti] [/xieti]str="[zz]neighboring [/zz]Jing'an districe";完后有人给出解答:
final String str = "[zz]neighboring [/zz]Jing'an districe";
final String regex = "(.*\\[zz\\]).*(\\[/zz\\].*)";
System.out.println(str.replaceAll(regex, "$1$2"));
我现在有几个地方不明白:1. .*代表什么?貌似.代表一个任意字符,而*代表0个或多个字符,那也就是说.*还是代表0个或多个字符(跟*一样),如果是这样的话,我把.*改成了\\*为什么就匹配不了了呢?
2. 这正则里面有2个括号,这是干什么的?
3. $1$2是什么意思?
如下:去掉[zz] [/zz]中间的字符
当然,[zz]是可以自定义的。可以换成[xieti] [/xieti]str="[zz]neighboring [/zz]Jing'an districe";完后有人给出解答:
final String str = "[zz]neighboring [/zz]Jing'an districe";
final String regex = "(.*\\[zz\\]).*(\\[/zz\\].*)";
System.out.println(str.replaceAll(regex, "$1$2"));
我现在有几个地方不明白:1. .*代表什么?貌似.代表一个任意字符,而*代表0个或多个字符,那也就是说.*还是代表0个或多个字符(跟*一样),如果是这样的话,我把.*改成了\\*为什么就匹配不了了呢?
2. 这正则里面有2个括号,这是干什么的?
3. $1$2是什么意思?
*是零次或多次匹配,.*确实是匹配0个或多个字符,
\\*成转义了,就只是一个真实的*号,
String str = "*aa";
System.out.println(str.replaceAll("\\*",""));
可以用这个看看实际效果
2 3可以一起回答,加括号是为了引用正则表达式里面的内容
$1表示第一个括号里面的内容,$2表示第二个,依次类推
如果你的标签字母个数大致知道,那么还可以这样,\\1 \\2,$1 $2这些其实都是引用你的匹配组匹配到的内容。\\1 \\2 这种写法是在同个正则式里面“先抓到了,后面就可以引用”,比如下面的在第一轮替换时候\\1,就是1号匹配组([^\\]]{1,10}?)匹配到的zz,第二轮,\\1就是1号匹配组([^\\]]{1,10}?)匹配到的wahaha。$1,$2也是表示1号匹配组,2号匹配组这个意思,也是表示匹配到的内容,不过是在正则式外边引用。
final String str = "[zz]neighboring [/zz]Jing'an districe[wahaha]ssdfsdfsdf[/wahaha]";
final String regex = "(?<=\\[([^\\]]{1,10}?)\\])(.*)(?=\\[/\\1\\])";
System.out.println(str.replaceAll(regex, ""));
String str = "[zz]neighboring [/zz]Jing'an districe";
String regex = "(?i)(?<=\\[zz\\])[^\\[]*(?=\\[/zz\\])";
System.out.println(str.replaceAll(regex, ""));如果不保留
String str = "[zz]neighboring [/zz]Jing'an districe";
String regex = "(?i)\\[zz\\][^\\[]*\\[/zz\\]";
System.out.println(str.replaceAll(regex, ""));其它的都属于基本的正则语法规则,各种资料中都有介绍,就不详细解释了
也可以去我的博客看看,虽然.NET介绍得多些,但基本语法规则还是通用的
String str = "[zz]neighboring [/zz]Jing'an districe";
String regex = "(?i)(?<=\\[zz\\])[^\\[]*(?=\\[/zz\\])";
System.out.println(str.replaceAll(regex, ""));
试着对5楼进行一下解释
0宽度的非捕获组中的4种 (还是容易理解的)
(?=X):后跟X
(?!X) 后不跟X
(?<=X)前面是X
(?<!X) 前面不是X
1 (?i) 这是一个非捕获组,代表本Pattern是不区分大小写的
2 (?<=\\[zz\\]) 代表本Pattern的前面是[zz] 注意:由于'['和']'在代表Pattern的字符串中有特别的含义所
以要用\转义成\\[ . 只有一个\也是不成的,因为\本身也需要转义
3 [^\\[]* 这里一定要看仔细哦.我刚一开始也看晕了.我们知道 [a]代表一个字符a. [^a]代表除了a之外 的其他任何字符 .\\[是转义,那么整个含义就清楚了.不是[的任何其他字符,这样的字符有多少个呢.用*代表-->0个或多个
4(?=\\[/zz\\]) 又是一个非捕获组,含义还是清楚的.就是本Pattern的后面是[/zz].注意转义就OK
5 tr.replaceAll(regex, "") 替换的时候就清楚了.替换成空就OK,也就是把本注释的第3条替换成空字符串. 完整的来一次把向前是[zz]向后是[/zz]中间的所有内容替换成"",并且中间的内容不能含有字符'['
恩..希望我表达得还算清楚
String regex = "](.*?)\\[";
System.out.println(str.replaceAll(regex, "]["));