1、如何把下面代码,改为用正则表达式,只用一个replaceAll()来解决呢?
"!@##$dslk4032ld--s23%$#^&^*&*(;--qqqq".replace("#", "#").replace("%", "%").replace(";",";").replace("--", "-").replace(" ", " ")
2、如何只把exec或eXeC或ExeC和execute或ExEcuTe等等,全部替换为exec或execute,因为exec开头的英文单词还有不少,我也不想这两个命令以外的其他单词替换掉。
9 个解决方案
#1
第一个问题没什么高效的办法.自己写程序去char[]里找,然后替换可能还快点儿.
第二个问题可以替换 "exec " 为 "exec ",后面都加个空格.然后正则有忽略大小写的方式,可能解决有些字符大写的问题.
第二个问题可以替换 "exec " 为 "exec ",后面都加个空格.然后正则有忽略大小写的方式,可能解决有些字符大写的问题.
#2
还有一个:
我想把textarea传入数据库的内容里面,重复的<p><p>。。。。,全部替换成一个<p>。
我的代码是这样的:
System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("[<p>]{2,}+", "<p>"));
但结果是:abc<p>cd<p>ef<p>kde<。
也就是说,重复的p和<,都被替换成<p>了。应该如何修改呢?
我想把textarea传入数据库的内容里面,重复的<p><p>。。。。,全部替换成一个<p>。
我的代码是这样的:
System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("[<p>]{2,}+", "<p>"));
但结果是:abc<p>cd<p>ef<p>kde<。
也就是说,重复的p和<,都被替换成<p>了。应该如何修改呢?
#3
第一个问题,我很奇怪你需求,因为你的replacement是和前面的regex一一对应的,这样的话一个replaceAll应该是解决不了问题的.
就你这样写其实已经是用到正则了,以下是String.replace的实现代码.
第二个问题,有思路,也实现了,但是自己感觉写法上不太好,再想想吧,匹配思路是,
开头(?i)exec非字母 或者 非字母(?i)exec非字母 或者 非字母(?i)exec结尾
execute同理
没有找到java匹配一个单词的简单用法.
第三个问题是因为你用到了[],[]其中的字符是或的关系,按你的写法意思是只要出现了多个<或>或p都会被替换.
就你这样写其实已经是用到正则了,以下是String.replace的实现代码.
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
第二个问题,有思路,也实现了,但是自己感觉写法上不太好,再想想吧,匹配思路是,
开头(?i)exec非字母 或者 非字母(?i)exec非字母 或者 非字母(?i)exec结尾
execute同理
没有找到java匹配一个单词的简单用法.
第三个问题是因为你用到了[],[]其中的字符是或的关系,按你的写法意思是只要出现了多个<或>或p都会被替换.
System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("<p>(?=<p>)", ""));
//我的思路是匹配<p>后面是否还有<p>,有的话将前面的<p>删掉.试过了应该没问题
#4
str = "exec或eXeC或ExeC和execute或ExEcuTe等等Exece,全部替exec或execute";
str = str.replaceAll("(?i)exec(?!\\w)","exec").replaceAll("(?i)execute(?!\\w+)","execute");
System.out.println(str);
str = "abc<p><p><p>cd>>>>efpppkde<";
str = str.replaceAll("(<p>)\\1*","<p>");
System.out.println(str);
#5
第二个问题前后匹配边界行不行?
\\b(?i)exec\\b
\\b(?i)execute\\b
#6
问题基本上都解决了,但因为刚接触正则,还有很多疑问。还想再问一个问题:
Greedy 数量词 、Reluctant 数量词 、Possessive 数量词 是不是可以同时用?写法好像有些不同。
会不会冲突?
Greedy 数量词 、Reluctant 数量词 、Possessive 数量词 是不是可以同时用?写法好像有些不同。
会不会冲突?
#7
对于<p>,我最终的写法是:(<p>){2,},原因只有一个,我比较容易看得明白。这个写法是综合了4楼家括号()和我自己原来的写法的。只是4楼的\\1*的写法,我在JAVAAPI说明书里面看不到。
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
呵呵,请恕我愚钝,水平如此,只能按图索骥,对号入座。
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
呵呵,请恕我愚钝,水平如此,只能按图索骥,对号入座。
#8
在前面用了(<p>),表示将<p>作为一个group,而\\1*表示group(1)零或多个. ()就是分组,从左往右1-9组,最多就是group(9). 但是(?的用法不算分组.
这个可以参见Matcher里面的group(int)方法.
Greedy 和 Reluctant 参考此帖34楼 火龙果大哥的回复
不同的数量词应该可以在一个表达式中同时出现不冲突,因为每一个数量词都是对应它之前的字元,所以一个表达式中的不同字元用不同的数量词应该是不会冲突的,自己的理解,还没去验证过.
#9
哇,,,,太、、太、、太什么呢???我都不知道了。
有时间在仔细学习吧!!!只怪自己太忙了。
有时间在仔细学习吧!!!只怪自己太忙了。
#1
第一个问题没什么高效的办法.自己写程序去char[]里找,然后替换可能还快点儿.
第二个问题可以替换 "exec " 为 "exec ",后面都加个空格.然后正则有忽略大小写的方式,可能解决有些字符大写的问题.
第二个问题可以替换 "exec " 为 "exec ",后面都加个空格.然后正则有忽略大小写的方式,可能解决有些字符大写的问题.
#2
还有一个:
我想把textarea传入数据库的内容里面,重复的<p><p>。。。。,全部替换成一个<p>。
我的代码是这样的:
System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("[<p>]{2,}+", "<p>"));
但结果是:abc<p>cd<p>ef<p>kde<。
也就是说,重复的p和<,都被替换成<p>了。应该如何修改呢?
我想把textarea传入数据库的内容里面,重复的<p><p>。。。。,全部替换成一个<p>。
我的代码是这样的:
System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("[<p>]{2,}+", "<p>"));
但结果是:abc<p>cd<p>ef<p>kde<。
也就是说,重复的p和<,都被替换成<p>了。应该如何修改呢?
#3
第一个问题,我很奇怪你需求,因为你的replacement是和前面的regex一一对应的,这样的话一个replaceAll应该是解决不了问题的.
就你这样写其实已经是用到正则了,以下是String.replace的实现代码.
第二个问题,有思路,也实现了,但是自己感觉写法上不太好,再想想吧,匹配思路是,
开头(?i)exec非字母 或者 非字母(?i)exec非字母 或者 非字母(?i)exec结尾
execute同理
没有找到java匹配一个单词的简单用法.
第三个问题是因为你用到了[],[]其中的字符是或的关系,按你的写法意思是只要出现了多个<或>或p都会被替换.
就你这样写其实已经是用到正则了,以下是String.replace的实现代码.
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
第二个问题,有思路,也实现了,但是自己感觉写法上不太好,再想想吧,匹配思路是,
开头(?i)exec非字母 或者 非字母(?i)exec非字母 或者 非字母(?i)exec结尾
execute同理
没有找到java匹配一个单词的简单用法.
第三个问题是因为你用到了[],[]其中的字符是或的关系,按你的写法意思是只要出现了多个<或>或p都会被替换.
System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("<p>(?=<p>)", ""));
//我的思路是匹配<p>后面是否还有<p>,有的话将前面的<p>删掉.试过了应该没问题
#4
str = "exec或eXeC或ExeC和execute或ExEcuTe等等Exece,全部替exec或execute";
str = str.replaceAll("(?i)exec(?!\\w)","exec").replaceAll("(?i)execute(?!\\w+)","execute");
System.out.println(str);
str = "abc<p><p><p>cd>>>>efpppkde<";
str = str.replaceAll("(<p>)\\1*","<p>");
System.out.println(str);
#5
第二个问题前后匹配边界行不行?
\\b(?i)exec\\b
\\b(?i)execute\\b
#6
问题基本上都解决了,但因为刚接触正则,还有很多疑问。还想再问一个问题:
Greedy 数量词 、Reluctant 数量词 、Possessive 数量词 是不是可以同时用?写法好像有些不同。
会不会冲突?
Greedy 数量词 、Reluctant 数量词 、Possessive 数量词 是不是可以同时用?写法好像有些不同。
会不会冲突?
#7
对于<p>,我最终的写法是:(<p>){2,},原因只有一个,我比较容易看得明白。这个写法是综合了4楼家括号()和我自己原来的写法的。只是4楼的\\1*的写法,我在JAVAAPI说明书里面看不到。
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
呵呵,请恕我愚钝,水平如此,只能按图索骥,对号入座。
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
呵呵,请恕我愚钝,水平如此,只能按图索骥,对号入座。
#8
在前面用了(<p>),表示将<p>作为一个group,而\\1*表示group(1)零或多个. ()就是分组,从左往右1-9组,最多就是group(9). 但是(?的用法不算分组.
这个可以参见Matcher里面的group(int)方法.
Greedy 和 Reluctant 参考此帖34楼 火龙果大哥的回复
不同的数量词应该可以在一个表达式中同时出现不冲突,因为每一个数量词都是对应它之前的字元,所以一个表达式中的不同字元用不同的数量词应该是不会冲突的,自己的理解,还没去验证过.
#9
哇,,,,太、、太、、太什么呢???我都不知道了。
有时间在仔细学习吧!!!只怪自己太忙了。
有时间在仔细学习吧!!!只怪自己太忙了。