这个字符串的问题 搞得头疼死也想不明白 求指教!

cong0ks 2018-11-26 12:36:19
package day04;

public class StringDemo2 {
public static void main(String[] args) {
String w1 = "a";
String w2 = w1.replaceAll("\\d?","t");
String w3 = "7";
String w4 = w3.replaceAll("\\d?","t");
System.out.println(w2);
System.out.println(w4);
}

}


输出结果是
tat
tt

求大神解释的详细点!
...全文
148 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
咸哼酒家 2018-11-26
  • 打赏
  • 举报
回复
public static void asd(){
/**
* 默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
* 如:String str="abcaxc";
     *Patter p="ab.*c";
   *贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。
   *非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.*c)。
*/
System.out.println("a".replaceAll("\\?","t"));//a 非贪婪匹配,最小长度
System.out.println("a".replaceAll("","t"));//tat 贪婪匹配,最大长度
System.out.println("7".replaceAll("\\d?","t"));//tt 将连着的数字和空格一起转化,非贪婪匹配,最小长度
System.out.println("7".replaceAll("\\?","t"));//7 非贪婪匹配,最小长度
System.out.println("7".replaceAll("","t"));//t7t 贪婪匹配,最大长度
System.out.println("7a".replaceAll("\\d","t"));//ta 将数字转化,贪婪匹配,最大长度
}
nayi_224 2018-11-26
  • 打赏
  • 举报
回复
引用 6 楼 cong0ks 的回复:
[quote=引用 3 楼 nayi_224 的回复:] 换一个例子说
		String w1 = "aaa";
        String w2 = w1.replaceAll("\\d?","t");
tatatat ?其实就是{0,},“空”也会被匹配上,比如两个a之间的“空”。
?是{0,1} 把兄弟 ?两个a 之间的 "空" 这个"空"怎么解释。。。[/quote] 失误,确实是{0,1}。 你可以这么理解,虽然你看着是aa,但是计算机看的可能是1{0}a1{0}a1{0},我说的空指的就是1{0},它当然可以被\\d所匹配。
        String w3 = "71";
        String w4 = w3.replaceAll("7{0}","t");
t7t1t
        String w3 = "71";
        String w4 = w3.replaceAll("7{0,1}","t");
tt1t 少个t是因为7{0,1}会匹配1{0}7
cong0ks 2018-11-26
  • 打赏
  • 举报
回复
烦躁,有没有大神能说清楚。。。。
cong0ks 2018-11-26
  • 打赏
  • 举报
回复
引用 3 楼 nayi_224 的回复:
换一个例子说
		String w1 = "aaa";
        String w2 = w1.replaceAll("\\d?","t");
tatatat ?其实就是{0,},“空”也会被匹配上,比如两个a之间的“空”。
?是{0,1} 把兄弟 ?两个a 之间的 "空" 这个"空"怎么解释。。。
cong0ks 2018-11-26
  • 打赏
  • 举报
回复
引用 1 楼 yangyang_VV 的回复:
Java中\\d?拆分来看,第一个\转义不用管,在java中\d表示1~9任意字符串,变量后面有?标识他是贪婪模式,(贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配,tat。非贪婪匹配:就是匹配到结果就好,就少的匹配字符。就如上面\d将7换为t,后面又加个t)
你这个解释的我还是不明白。。。。能把tat 和 tt的每一个意义说下么?而且你说的两种匹配模式,这正则都一样咋就变两种匹配模式呢。。。。
nayi_224 2018-11-26
  • 打赏
  • 举报
回复
换一个例子说
		String w1 = "aaa";
        String w2 = w1.replaceAll("\\d?","t");
tatatat ?其实就是{0,},“空”也会被匹配上,比如两个a之间的“空”。
yangyang_VV 2018-11-26
  • 打赏
  • 举报
回复
Java中\\d?拆分来看,第一个\转义不用管,在java中\d表示1~9任意字符串,变量后面有?标识他是贪婪模式,(贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配,tat。非贪婪匹配:就是匹配到结果就好,就少的匹配字符。就如上面\d将7换为t,后面又加个t)
qq_39936465 2018-11-26
  • 打赏
  • 举报
回复
这里?{0,1} 0表示没有,1表示有1个。我可能说的不是很清楚,这里的问题主要是对正则表达式没理解的问题,请认真研究下正则表达式就会明白。还有就是这里的?都是非贪婪模式,有几位解释有错误。所以最后结果只存在 ?a? 而不会存在??a??的情况。其实7 你可以直接看成?号就可以了理解了。a因为不符合条件(条件是数字)无法用?来替换。
qq_39936465 2018-11-26
  • 打赏
  • 举报
回复
replaceAll 其实就是匹配所有可能性, 这里的“\\d?”是正则表达式,而不是字串,\d表示数字,?表示{0,1},而把字符串“a” 转化为符合“\\d?”表达式要求的包含所有可能性最终结果是 “?a?” 。

注:这里 ?a =a ,a?=a, ?a?=a;而数字其实也是这样 ?7 = 7,7?=7 ,不管7?还是?7 最后得到的正则表达式都是??。

所以一个结果是 tat 一个是tt 。

正则表达式和字符串是不同的,要替换字符串用replace 而不是replaceAll。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧