正则表达式基于JavaScript的入门详解

关于正则表达式,和很多前辈聊起这个知识点时,他们的反馈都比聊其他技术谦逊,而和很多刚入门的程序员讨论时甚至会有觉得你看不起他。

的确,正则表达式从通常的应用来看,的确不难,比如电话,邮箱等验证。语法,逻辑都算不上复杂,我之前也认为正则表达式也算不上什么高大上的技术。

但是,改变我看法的是,有一次有个前辈给我出了一个题:

将一串数字从后向前每隔三位打点,例如“100000000000000”;

var str = "100000000000000";
var reg = /(\B)(?=(\d{3})+$)/g;
console.log(str.replace(reg,"."));
//输出结果:100.000.000.000.000

后来他跟我说,这个题是百度有一年校招的最后一个题,20分。

有人会说,这个并不是唯一的解法。

不错,这的确不是,但是只有这个解法当年百度给了满分,其他解法就算答案正确,基本上都只给了3~5分。

或许这个事情告诉了我们,结果并不是编程的“结果”,程序的核心价值应该是效率。

正则表达式在基础应用领域的确不难,但是在实际解决问题的时候能用正则表达式化繁为简的不见得有多少人能做得到。

我对正则表达式也只能说是做到了解,写这篇博客的原因是希望能与大家互动学习深入的掌握正则表达式,有什么关于正则表达式的问题大家可以在评论区留言交流,也希望大家多多分享关于正则表达式的实际应用,同时,我也用过这篇文章总结一些关于正则表达式的基础知识点,方便大家查阅和学习交流,有什么地方总结的不正确的地方还希望大家多多指正。

正则表达式的基础知识点:

1.转义字符

2.元字符

3.区间——方括号[]

4.重复限定符(量词)

5.边界与属性

6.分组与子表达式及反向引用

7.条件或

8.捕获与非捕获

9.零宽断言

10.贪婪与非贪婪

以上就是正则表达式的所有知识点,内容之少,但是其分量在编程领域之重不言而喻,所有的编程语言都有正则表达式就说明了这一点。

我的总结没有根据知识点的难易程度来排序,在写这篇博客之前我也参考了别人的博客,甚至我开始学习的时候很大程度也是靠读博客,但是我总感觉有些方式并不是很合适,大部分的正则表达式入门博客都是基于难易程度排序来讲,而且还拆分的很细,有的之间有很大关联的知识点被拆分,中间还隔了几个知识点,理解起来费劲。

这么来讲吧,我看过好几本研究关于记忆和学习的书,它们都有一个共通点,就是讲究知识的关联性,甚至在一些记忆大师的理论里,他们为了强记一些没有关联的信息时都会特意采用一些其他关联性的将其关联起来,来加强记忆,比如很出名的《记忆宫殿》,好了,有点扯远了,我只想告诉大家我这样的总结安排会更加适合理解学习。

1.转义字符:“\”

其实转义字符算不上完全的正则表达式的知识点。

将他放到这里来讲,而且还放到第一个来讲,是考虑到方便刚刚学习正则表达式的同学理解后面的知识点。

通俗的解释转义字符就是,通过“\”来表达我们不能按照正常字符表达方式的字符。

示例,如果在一个字符串中有一个双引号字符:

var mark= "ab\"cd";
console.log(mark);
//输出ab"cd

反斜杠“\”在字符串中的作用就是,将它后面的字符变成该字符串的文本,而本身不作为字符串的实际字符。

转义字符,也就是反斜杠"\"在程序逻辑上,作用是清除字符本身自带的语法含义。上一个示例就是利用反斜杠清楚了双引号的语法含义。

//1.本身不作为字符串的实际字符
var mark = "ab\cd";
console.log(mark);
//输出结果:abcd
//2.如果反斜杠是字符串的一个字符?
var backslash ="\\";
console.log(backslash);
//输出结果:\ //3.一个字符串中包含了一个反斜杠“\”,恰好后面还跟了一个n或者r又或者0 //会出现什么情况,怎么解决 var n = "ab\ncd"; //输出结果:ab // cd var nn = "ab\\ncd"; //输出结果:ab\ncd var r = "ab\rcd"; //输出结果:abcd var rr = "ab\\rcd"; //输出结果:ab\rcd var zero = "ab\0cd"; //输出结果:ab cd var zeros = "ab\\0cd"; //输出结果:ab\0cd;

 转义字符还有一个比较常用的实际开发应用,就是我们遇到一个结构比较复杂的字符,

但是字符串在通常的语法中不能换行,这时我们就可以采用转义字符来解决。

var inhtml = "\
    
XXXXX
\
    \
  • XXX
  • \
  • XXX
  • \
\
";

关于转义字符暂时就解释到这里,很简单的一个知识点,算是一个前期铺垫吧。

2.元字符

 元字符 说明
 . 匹配除换行(\n)和回车符(\r)以外的任何字符
 ^ 匹配字符串的开始位置。(边界部分详细介绍)
 $ 匹配字符串的结束位置。(边界部分详细介绍)
 \w 匹配单词字符,即0-9A-z_;(区间部分详细介绍)
 \W 匹配非单词字符,即除了\w以外的任何字符(区间部分详细介绍)
 \d 匹配数字,即0-9;(区间部分详细介绍)
 \D 匹配非数字字符,即除了\d的任何字符(区间部分详细介绍)
 \s 匹配空白字符 。(区间部分详细介绍)
 \S 匹配非空白字符。(区间部分详细介绍)
 \b 匹配单词边界, 即单词的前后两个位置。(边界部分详细介绍)
 \B 匹配非单词边界,即不是单词的前后两个位置。(边界部分详细介绍)
 \0 匹配null,在字符串中采用转义形式,\0实现的是一个空格的效果。(根据转义字符,参考\n的详细说明理解)
 \n

匹配换行字符。

在字符串中出现了\n如:var str = "ab\ncd";匹配字符串str的正则可以写成/ab\ncd/或者/\w\w\n\w\w/;

如果通过console.log输出的字符串是:ab\ncd,我们可以通过转义字符推导出字符串为"ab\\ncd";相匹配的字符串也要写成/ab\\ncd/;

 \f 匹配换页符。(根据转义字符,参考\n的详细说明理解)
 \r 匹配回车符。(根据转义字符,参考\n的详细说明理解)
 \t 匹配制表符。(根据转义字符,参考\n的详细说明理解);(\t同等于在编辑文本时输入TAB键,但是在字符串中输入TAB会被编译成空格,要想在字符串中获得实际的TBA键入一样的效果就是在字符串中写入\t,所以就有了这个反向字符)
 \v 匹配垂直制表符。(根据转义字符,参考\n的详细说明理解)
 \XXX 匹配以八进制数XXX规定的字符 。
 \Xdd 匹配以十六进制数dd规定的字符 。
 \uXXXX 匹配以十六进制数XXXX规定的Unicode字符。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.区间——方括号[]

正则表达式提供一个元字符“方括号”(也通常称“中括号”)来表示一个字符的取值范围。

  限定一个字符为0~9可以写成[0-9]; -->即为数字字符,也可以用“\d”表示。

  限定一个字符为a~z,即为小写字母可以写成[a-z];

  限定一个字符为A~Z,即为大写字母可以写成[A-Z];

  所以如果一个字符为任意字母和数字可以表示为[a-zA-Z0-9]。

  限定一个字符是指定的几个字符中的任意一个可以写成[a%M],即表示这个字符只能是“a”,“%”,"M"其中的一个。

  也可以通过[^]的方式反向取值,即表示除了罗列的字符以外的任意字符。

  假设一个字符不是"a","b","c"的任意字符可以表示成[^abc]。

在前面的元字符中,很多都拥有类似功能,其实际也是区间的一种表达形式,下面我就用区间的形式解析出来,供大家参考。

1 \w === [0-9A-z_];
2 \W === [^\w];
3 \d === [0-9];
4 \D === [^\d];
5 \s === [\t\n\r\v\f];
6 \S === [^\s];

4.重复限定符(量词)

 语法  说明
 *  重复零次或更多次
 +  重复一次或更多次
 ?  重复零次或一次
 {n} 重复n次
 {n,} 重复n次或更多次
 {n,m}  重复n到m次

 

 

 

 

 

 

 

 

 

 

 

 

 

在没有重复限定符的情况下,正则表达式就是一个累赘,所以在前面一直没有真正意义的写过示例演示。

有了重复限定符之后,应用一些实例来理解正则表达式:

 1 //匹配11位数的手机号码
 2 //不使用重复限定符的情况下
 3 /^1\d\d\d\d\d\d\d\d\d\d$/
 4 //使用重复限定符
 5 /^1\d{10}$/
 6 
 7 //匹配八位数的QQ号码
 8 /^\d{10}$/
 9 
10 //匹配银行卡号14至18位的数字
11 /^\d{14,18}$/
12 
13 //匹配任意长度的单词
14 /\b\w+\b/

5.边界与属性

  在解析边界与属性之前,我们先要了解一下正则表达式的匹配原则。

  正则表达式代表的是一个字符串中的某个片段的规律,

  当使用正则表达式的方法对一个特定的字符进行匹配的时候,

  正则表达式会对字符的每个字符从前往后逐个匹配。

 属性  说明
 g  全局匹配
 i  忽略字母大小写
 m  多行匹配

 

 

 

 

 

 

 

  关于g的全局匹配逻辑我觉得用下面一段代码更容易解释,也更清晰明了。

 1 var str = "a1b2c3d";
 2 var reg = /\d/;
 3 //匹配到的结果是:1
 4 var reg1 = /\w/g;
 5 //匹配到的结果是:1,2.3
 6 
 7 var str1 = "a123b456c789d";
 8 var reg2 = /\w+/;
 9 //匹配结果是:123;
10 var reg3 = /\w+/g;
11 //匹配到的结果是:123,456,789;

  以上的代码说明了g属性可以使字符串中,符合条件的所有片段匹配出来。

  这时候有的同学就会说23,56,89也符合\d+的形式,是的,从正则表达式来讲的确符合条件,

  但是,匹配原则不会重新匹配已经被匹配的字符。

 

  接下来解释,关于边界内容,先看以下示例:

  字符串12345678符合/\d{8}/,如果使用这样的一个正则表达式来验证8位数的字符串是否合理呢?

  如果出现字符串123456789,/\d{8}/也符合匹配条件,但是他却不是8位数的字符串。

  这时候我们就需要引入边界来解决这个问题:

var str1 = "12345678";
var str2 = "123456789";
var reg = /^\d{8}$/;
//字符串str1能被成功匹配

//还可以使用下面的正则表达式进行匹配验证
var reg3 = /\b\d{8}\b/
//实质上\b是表示一连串符合\w的字符的前后位置
//元字符中\w的官方说明就是单词字符,其中包括了[A-z0-9_]
//所以我们可以通过以下正则表达式来获取一段英文的所有单词
var reg4 = /\b\w+\b/g;

  以上代码说明了:^ 表示字符串的开始位置;$ 表示字符串的结束位置; \b表示单词的开始或结束位置。

  关于边界就还剩下两个问题:

  a.^在正则表达式中存在多重含义:一种是在区间内作为开头表示非的意思,在边界上表示字符串的起始位置。

  b.非单词边界指的是什么?

//有如下字符串
var str = "this is my phone";
//需求:判断这段英文中有没有单词中包含is,但不是独立的一个is单词。
var reg = /\Bis/g;
//非单词边界意思就是不是单词的开头和结尾处

  关于属性,还有"i"和"m"分别具备什么功能?

//有需求:在一段英文中匹配到is这个单词,并且忽略大小写
var reg = /\b[iI][sS]\b/g;
//若采用i属性忽略大小写就可以写成
var regi = /\bis\b/ig;

//如果有这样一串字符串
var str = "ab\nacd\naef";
var regs = /^a\w+/g;
//匹配结果是:ab
var regm = /^a\w+/gm;
//匹配结果是:ab,acd,cef;

  i属性忽略字母大小写就不再多做解释了。

  m属性可能会有很多朋友不是很清楚,

  在这里如果要严格的理解"^"这个符号就是一行字符串开头的意思。

  所以,通过m属性匹配上面示例的结果就会有三个。

  (其实主要的问题是在于对“^”符号的的理解误区,通常我们在正则表达式内,这个符号在边界的意义都理解为字符串的开头,其实不然,准确的说是一行字符串的开头。)

6.分组与子表达式及反向引用

  关于分组对于表达式至关重要,后面的几个知识点都会围绕分组展开。

  如果只是分组,它本身是一个非常简单易懂的知识点:

1 var str = "abcdef";
2 //用正则表达式分组的形式按每组两个字符进行匹配
3 var reg = /(ab)(cd)(ef)/;

  以上示例中的正则表达式实际的匹配结果与/abcdef/没有任何区别,都是将整个str字符匹配出来。

  但是,本身看似没有任何意义反而成就了他的价值,就想HTML的div标签一样,实际没有任何特性的容器标签却成了HTML中最重要的一个标签。

  不扯远了,回到正则分组的本身,正则表达式有了分组,就像碳元素在高温环境下有了氧气;

  因为分组,产生了子表达式:

  在上面的示例中,正则表达式中的分组产生了三个子表达式:(ab),(cd),(ef)

//子表达式再上一个示例中没有什么价值
//如果有以下字符串(大驼峰命名规则)
var str = "AbafdcDfdefGhfdi";
//如果需要用正则表达式来验证的话,正则可以写成
var reg = /^([A-Z][a-z]+)+$/

  验证大驼峰命名法的字符串,就是应用了分组的子表达式重复匹配来简化代码。

  从这里开始,感觉正则表达式要走上风骚路线了,接下来看看反向引用

 1 //查找以下字符串中连续重复出现的单词,并且忽略大小写
 2 var str = "Is is the cost of of gasoline going up up?";
 3 var reg = /(\b[a-z]+\b) \1/ig;
 4 
 5 //匹配连续出现的字母组合的字符串片段
 6 var str1 = "abcabcabc";
 7 var reg1 = /^(\w{2})\1+$/;
 8 
 9 //匹配一下形式的字母组合的正则表达式
10 var str2 = "aabb";
11 var reg2 = /(\w)\1(\w)\2/g;

  刚接触反向引用事,看到上面的示例,我想每个人都会有这样的疑问:\1和\2是什么意思?

  这里的1和2所表示的就是第一个子表达式和第二个子表达式通过匹配获取到的对应的“字符串片段”的引用。

  以最后一个示例为例,匹配过程可以将其拆分成两个步骤:

  第一个步骤是子表达式匹配获得匹配结果:/(\w)a(\w)b/;  ——>子表达式优先匹配,获取匹配到的具体字符串片段,并传给引用自己的引用。

  第二个步骤就是将第一个步骤获取到的具体的表达式与字符串匹配。

  (提供一个记忆理解的方法:反向引用这个技术名称别只看着高大上,其实本质上已经通过语义化向我们传递了很多信息,数字n表示第几个子表达式,即为引用值。

  而反向即为将数字原本在正则表达式中表示的是一个字符,通过转义字符反转为一个引用对象;反向还有的第二层含义就是数字引用的不是子表达式的本身,

  而是通过子表达式匹配的对应字符串片段。)

7.条件或 —— |

  条件或其实与通常编程中的双竖线“||”是一个意思,只不过在正则表达式中只要写一个竖线“|”。

  示例说明:

//我们的手机号码不同的运营商,开头的三个数字都不同,而且每个运营商下都有好几个不同的开头数字。
//例如联通旗下有:130/131/132/155/156/185/186/145/176
//如果业务需求是要匹配所有的联通手机号码。请看下列代码:
var reg = /^(130|131|132|155|156|185|186|145|176)\d{8}$/;

  很简单的一个知识点,但是要借助分组来表示,所以就留到这里来讲了。

8.捕获与非捕获

  在解析捕获与非捕获前,我想先在这里添加一些内容,帮助更好的理解这一部分知识点。

  就是基于JavaScript关于正则表达式的一个操作方法:

  JavaScript的RegExp对象的exec()方法:

  不过在这里暂时不对方法的所有内容进行解析,只解析部分与捕获相关的内容。

1 //还是延用分组的示例,毕竟捕获是基于分组的
2 var str = "abcdef";
3 //用正则表达式分组的形式按每组两个字符进行匹配
4 var reg = /(ab)(cd)(ef)/;
5 //使用exec()方法获取到匹配结果
6 console.log(reg.exec(str));
7 //匹配结果是:["abcdef", "ab", "cd", "ef", index: 0, input: "abcdef", groups: undefined]

  在这个匹配结果里,类数组的第一个元素就是正则表达式匹配到的内容

  第二个元素:“ab”是第一个子表达式的匹配结果

  第三个元素:“cd”是第二个子表达式的匹配结果

  第四个元素:“ef”是第三个子表达式的匹配结果

  先不讨论,继续看以下示例

//在上面的示例基础上,正则表达式修改成
var reg = /(ab)(?:cd)(ef)/;
//使用exec()方法获取到匹配结果
console.log(reg.exec(str));
//匹配的结果是:["abcdef", "ab", "ef", index: 0, input: "abcdef", groups: undefined]

  这回的匹配结果发生了一个小小的变化。

  第二个子表达式的前面添加了“?:”,让匹配结果中没有出现第二个子表达式的对应元素;

  但是整个正则匹配结果,也就是类数组的第一个元素没有受到影响,还是和上一个示例的匹配结果完全一致。

  以上示例通过exec()方法展现出来的结果,就是捕获与非捕获的结果。

  捕获是正则表达式分组的一个特性,他会将每个分组即子表达式匹配到的结果提取出来,即为捕获。

  捕获产生了数据组,我们就可以通过反向引用的方式在正则表达式中,通过捕获数据组的“”键“”引用捕获值。(反向引用实现的底层原理)

  而非捕获就是在子表达式前面加上了“?:”,表示该组为非捕获组,非捕获组匹配的结果不会被提取,但是该组的匹配功能依然存在。

  看到以上的总结,大家可能视乎懂了捕获与非捕获,但是还是不知道捕获与非捕获有什么用途。

  请看以下示例:

var str = "aa11aa11aa11";
var reg1 = /((aa)(11))+/;
var reg2 = /(?:(aa)(11))+/;
console.log(reg1.exec(str));
//匹配结果是:["aa11aa11aa11", "aa11", "aa", "11", index: 0, input: "aa11aa11aa11", groups: undefined]
console.log(reg2.exec(str));
//匹配结果是:["aa11aa11aa11", "aa", "11", index: 0, input: "aa11aa11aa11", groups: undefined]

  上面的示例所展示的内容,可以看到一个区别,

  而恰恰是一个区别可以帮助我们解决一个巨大的困扰。

  在前面的总结中我们可以知道有了捕获数据可以被引用,

  但是在上面的这个示例的时候,当分组被嵌套的时候,

  “键”所对应的“值”就不会那么好对应了,比如上面示例的第一个匹配结果,如果在正则表达式中需要引用(aa)匹配的值,就是“\2”;

  非捕获也就是让被标注为非捕获组的对应匹配值不会出现在捕获数据内。

  

  很多朋友觉得捕获很难,我并不觉得,写了这么一大段我自己反而觉得累赘,看着就累,如果可以我觉得有下面一句话就可以了。

  被标注非捕获的分组,所匹配的字符串片段不能反向引用。

9.零宽断言

  零宽与断言这一部分,真的不难好吗?

  有多少人困在这一部分,点赞举手,我来告诉你们如何不难。

  我觉得这部分,难度不在知识点,而是在知识点的专业名称,我看到的和听到了就不下三种。

  所以我想先不解释理论和原理,直接看看怎么用,然后再解释原理。

 1 //如有需求:找到一个的开桑塔纳的车主(且名字为三个字)
 2 var str11 = "李小明开桑塔纳";
 3 var str12 = "王小明开福克斯";
 4 var reg1 = /^.{3}(?=开桑塔纳)/ 5 console.log(str11.match(reg1));
 6 console.log(str12.match(reg1));
 7 //输出结果:[李小明]
 8 //输出结果:null
 9 
10 
11 //有需要如:查找电话号码,电话号码前面的字符是“电话:”,但不能匹配该字段。
12 var str21 = "电话:15177775555";
13 var str22 = "金额:11111111111";
14 var reg2 = /(?<=电话:)1\d{10}/g;
15 console.log(str21.match(reg2));
16 console.log(str22.match(reg2));
17 //输出结果:[15177775555]
18 //输出结果:null
19 
20 //全局忽略大小写,查找后买没有all的is
21 var str3 = "Is this all there is";
22 var reg3 = /is(?! all)/gi;
23 console.log(str3.match(reg3));
24 //输出结果:["Is", "is"]
25 
26 
27 //假设有以下两个字符串,需要用正则判断不“美国芯片”
28 var str41 = "美国芯片";
29 var str42 = "中国芯片";
30 var reg4 = /(?;
31 console.log(str41.match(reg4));
32 console.log(str42.match(reg4));
33 //输出结果:null
34 //输出结果:["芯片", index: 2, input: "中国芯片", groups: undefined]

  我现在可以告诉你,零宽断言已经学完了,可能出现的四个特例在上面的实例中全部展示出来了。

  下面给大家介绍原理、特例(?=,?!,?<=,?

  在解释原理前,我们先来看看特例:

  xx(?=exp)表示查找xx,这个xx的后面必须跟着exp

  xx(?!exp)表示查找xx,这个xx的后面不能跟着exp

  (?<=exp)xx表示查找xx,这个xx的前面必须是exp

  (?

  零宽与断言的含义(即这两个专业名词描述了什么东西)

   断言:所谓断言,与通俗的表达是一回事,表示肯定什么的意思。这正则表达式内,断言就是表达“xx”字符串片段的前后肯定会出现什么样的情况。

  零宽:这个名称也是语义化的一个专业名称,大家发现所有四个特例都是以分组的方式写在正则表达式内,

     但是这样的分组不执行正则匹配,它的作用只是一个判断条件。也就是它不占用匹配的字符片段

  说了这么多,出一个小小的题,大家一起熟悉一下零宽断言:用正则表达式匹配获取一个网页的标题名称。

1 var str = "他乡踏雪的主页";
2 var reg = /(?<=).*(?=<\/title>)/<span style="color: #000000;">g;
</span><span style="color: #008080;">3</span> console.log(str.match(reg));</pre> 
  </div> 
  <span style="color: #33cccc;">点击"加号"查看结果</span> 
 </div> 
 <p>  接下来,就来解决名称的问题吧。这个问题就是个奇葩!</p> 
 <table border="1"> 
  <tbody> 
   <tr> 
    <td class="dy"> 正则表达式零宽断言的特例</td> 
    <td class="dyName1"> 第一类名称(参考百度百科)</td> 
    <td class="dyName2"> 第二类命名</td> 
   </tr> 
   <tr> 
    <td class="dy"> XX(?=exp)</td> 
    <td class="dyName1"> <strong>零宽度正预测先行断言</strong></td> 
    <td class="dyName2"> 正向前瞻</td> 
   </tr> 
   <tr> 
    <td class="dy"> XX(?!exp)</td> 
    <td class="dyName1"> <strong>零宽度负预测先行断言</strong></td> 
    <td class="dyName2"> 负向前瞻</td> 
   </tr> 
   <tr> 
    <td class="dy"> (?<=exp)xx</td> 
    <td class="dyName1"> <strong>零宽度正回顾后发断言</strong></td> 
    <td class="dyName2"> 正向后瞻</td> 
   </tr> 
   <tr> 
    <td class="dy"> (?<!exp)xx</td> 
    <td class="dyName1"> <strong>零宽度负回顾后发断言</strong></td> 
    <td class="dyName2"> 负向后瞻</td> 
   </tr> 
  </tbody> 
 </table> 
 <p>  <span style="color: #808080;">最后关于零宽断言,其实我也还有点疑惑,在很多博客和教程上见过说,js的正则不能用(?<=)和(?<!),我使用的是Chrome浏览器:版本 69.0.3452.0做的测试,没毛病,还望路过的大神指点一下,是不是真的有那个浏览器不兼容这两个零宽断言的特例。</span></p> 
 <p>10.贪婪与非贪婪</p> 
 <p>  这知识点几乎是正则表达式最冷门的一个,因为在日常开发中非常少用,特性本身也不太好驾驭。</p> 
 <p>  但是别小看它,千万别小看,我最后会给一个示例给大家看,你们就会明白。</p> 
 <p>  <span style="color: #808080;">那到底什么是贪婪模式和非贪婪模式呢?先看一个示例:</span></p> 
 <div class="cnblogs_code"> 
  <pre><span style="color: #008080;">1</span> <span style="color: #0000ff;">var</span> str = "abcaxcd"<span style="color: #000000;">;
</span><span style="color: #008080;">2</span> <span style="color: #0000ff;">var</span> reg = /ab.*c/<span style="color: #000000;">;
</span><span style="color: #008080;">3</span> <span style="color: #0000ff;">var</span> reg1 = /ab.*?c/<span style="color: #000000;">;
</span><span style="color: #008080;">4</span> <span style="color: #000000;">console.log(str.match(reg));
</span><span style="color: #008080;">5</span> <span style="color: #008000;">//</span><span style="color: #008000;">匹配到的结果是:abcaxcd</span>
<span style="color: #008080;">6</span> <span style="color: #000000;">console.log(str.match(reg1));
</span><span style="color: #008080;">7</span> <span style="color: #008000;">//</span><span style="color: #008000;">匹配到的结果是:abc</span></pre> 
 </div> 
 <p>  看到上面的示例后,两个正则表达式的差别就是在量词星号*的后面多了一个问号?</p> 
 <p>  这也就是贪婪与非贪婪的区别:</p> 
 <p>  <span style="color: #ff6600;">贪婪模式就是仅量词的最大值去匹配最多的相符的字符。</span></p> 
 <p><span style="color: #ff6600;">  非贪婪模式就是不管量词的最大范围有多大,只要是非贪婪模式就尽可能的少匹配字符。</span></p> 
 <p>  但是,有一种例外:</p> 
 <div class="cnblogs_code"> 
  <pre><span style="color: #0000ff;">var</span> str = "abcaxcd"<span style="color: #000000;">;
</span><span style="color: #0000ff;">var</span> reg = /ab.*?d/<span style="color: #000000;">;
console.log(str.match(reg));
</span><span style="color: #008000;">//</span><span style="color: #008000;">匹配结果是:abcaxcd</span></pre> 
 </div> 
 <p>  这种例外就是,当一个执行非贪婪模式匹配的字符后面,有一个匹配字符可以字符,贪婪模式会延伸,直到后面的字符被匹配到的前面结束匹配。</p> 
 <p>  记住,一定是后面的字符有可能被匹配到的情况下,否则匹配结果为null</p> 
 <p>  <span style="color: #808080;">接下来干点正事,关于贪婪模式与非贪婪模式的语法是应该正式的介绍一下了:</span></p> 
 <table class="tlTable" border="1"> 
  <tbody> 
   <tr> 
    <td class="tlItem"> 贪婪模式的量词表示</td> 
    <td class=""tlItem"> 非贪婪模式的量词表示</td> 
   </tr> 
   <tr> 
    <td class=""tlItem"> n*</td> 
    <td class=""tlItem"> n*?</td> 
   </tr> 
   <tr> 
    <td class=""tlItem"> n+</td> 
    <td class=""tlItem"> n+?</td> 
   </tr> 
   <tr> 
    <td class=""tlItem"> n?</td> 
    <td class=""tlItem">n??</td> 
   </tr> 
   <tr> 
    <td class=""tlItem"> n{x}</td> 
    <td class=""tlItem">n{x} ?</td> 
   </tr> 
   <tr> 
    <td class=""tlItem"> n{x,}</td> 
    <td class=""tlItem">n{x,} ?</td> 
   </tr> 
   <tr> 
    <td class=""tlItem"> n{x,y}</td> 
    <td class=""tlItem">n{x,y} ?</td> 
   </tr> 
  </tbody> 
 </table> 
 <p><span style="color: #808080;">   <span style="color: #000000;">最后兑现承诺,放大招,贪婪和非贪婪组合断言特性,看看以下示例:</span></span></p> 
 <div class="cnblogs_code"> 
  <pre><span style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;">有需求是:保留以下HTML文档中的innerText和hr标签</span>
<span style="color: #008080;">2</span> <span style="color: #0000ff;">var</span> str = "<p><a href='http://www.cnblogs.com/rubylouvre/'>Ruby Louvre</a></p><hr/><p>by <em>司徒正美</em></p>"<span style="color: #000000;">;
</span><span style="color: #008080;">3</span> <span style="color: #0000ff;">var</span> reg = /<(?!hr)(?:.|\s)*?>/<span style="color: #000000;">ig;
</span><span style="color: #008080;">4</span> console.log(str.replace(reg,""<span style="color: #000000;">));
</span><span style="color: #008080;">5</span> <span style="color: #008000;">//</span><span style="color: #008000;">打印结果是:Ruby Louvre<hr/>by 司徒正美</span></pre> 
 </div> 
 <p> </p> 
 <p>  关于正则表达式的基础内容总结就在以上全部内容了,</p> 
 <p>  后续还会有关于js正则应用的方法的具体解析,</p> 
 <p>  然后就是具体的正则表达式通式的归纳,</p> 
 <p>  还有正则表达式的面试习题,还希望大家能多多提供一些资源。</p> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1217852484744220672"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(正则表达式基于JavaScript的入门详解)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1835514462770130944.htm"
                           title="斤斤计较的婚姻到底有多难?" target="_blank">斤斤计较的婚姻到底有多难?</a>
                        <span class="text-muted">白心之岂必有为</span>

                        <div>很多人私聊我会问到在哪个人群当中斤斤计较的人最多?我都会回答他,一般婚姻出现问题的斤斤计较的人士会非常多,以我多年经验,在婚姻落的一塌糊涂的人当中,斤斤计较的人数占比在20~30%以上,也就是说10个婚姻出现问题的斤斤计较的人有2-3个有多不减。在婚姻出问题当中,有大量的心理不平衡的、尖酸刻薄的怨妇。在婚姻中仅斤斤计较有两种类型:第一种是物质上的,另一种是精神上的。在物质与精神上抠门已经严重的影响</div>
                    </li>
                    <li><a href="/article/1835514464028422144.htm"
                           title="情绪觉察日记第37天" target="_blank">情绪觉察日记第37天</a>
                        <span class="text-muted">露露_e800</span>

                        <div>今天是家庭关系规划师的第二阶最后一天,慧萍老师帮我做了个案,帮我处理了埋在心底好多年的一份恐惧,并给了我深深的力量!这几天出来学习,爸妈过来婆家帮我带小孩,妈妈出于爱帮我收拾东西,并跟我先生和婆婆产生矛盾,妈妈觉得他们没有照顾好我…。今晚回家见到妈妈,我很欣赏她并赞扬她,妈妈说今晚要跟我睡我说好,当我们俩躺在床上准备睡觉的时候,我握着妈妈的手对她说:妈妈这几天辛苦你了,你看你多利害把我们的家收拾得</div>
                    </li>
                    <li><a href="/article/1835514335561084928.htm"
                           title="芦花鞋一四" target="_blank">芦花鞋一四</a>
                        <span class="text-muted">许叶晗</span>

                        <div>又是在一个寒冷的夏日里,青铜和葵花决定今天一起去卖芦花鞋,奶奶亲手给他们做了一碗热乎乎的粥对他们说:“就靠你们两挣生活费了这碗粥赶紧趁热喝了吧!”于是青铜和葵花喝完了奶奶给她们做的粥,就准备去镇上卖卢花鞋,这回青铜和葵花穿着新的芦花鞋来到了镇上。青铜这回看到了很多人都在卖,用手势表达对葵花说:“这回有好多人在抢我们生意呢!我们必须得吆喝起来。”葵花点了点头。可是谁知他们也大声的叫,卖芦花喽!卖芦花</div>
                    </li>
                    <li><a href="/article/1835514307744460800.htm"
                           title="QQ群采集助手,精准引流必备神器" target="_blank">QQ群采集助手,精准引流必备神器</a>
                        <span class="text-muted">2401_87347160</span>
<a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a>
                        <div>功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以</div>
                    </li>
                    <li><a href="/article/1835514207114719232.htm"
                           title="关于沟通这件事,项目经理不需要每次都面对面进行" target="_blank">关于沟通这件事,项目经理不需要每次都面对面进行</a>
                        <span class="text-muted">流程大师兄</span>

                        <div>很多项目经理都会遇到这样的问题,项目中由于事情太多,根本没有足够的时间去召开会议,那在这种情况下如何去有效地管理项目中的利益相关者?当然,不建议电子邮件也不需要开会的话,建议可以采取下面几种方式来形成有效的沟通,这几种方式可以帮助你努力的通过各种办法来保持和各方面的联系。项目经理首先要问自己几个问题,项目中哪些利益相关者是必须要进行沟通的?可以列出项目中所有的利益相关者清单,同时也整理出项目中哪些</div>
                    </li>
                    <li><a href="/article/1835513803861749760.htm"
                           title="机器学习与深度学习间关系与区别" target="_blank">机器学习与深度学习间关系与区别</a>
                        <span class="text-muted">ℒℴѵℯ心·动ꦿ໊ོ꫞</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>一、机器学习概述定义机器学习(MachineLearning,ML)是一种通过数据驱动的方法,利用统计学和计算算法来训练模型,使计算机能够从数据中学习并自动进行预测或决策。机器学习通过分析大量数据样本,识别其中的模式和规律,从而对新的数据进行判断。其核心在于通过训练过程,让模型不断优化和提升其预测准确性。主要类型1.监督学习(SupervisedLearning)监督学习是指在训练数据集中包含输入</div>
                    </li>
                    <li><a href="/article/1835513701143244800.htm"
                           title="铭刻于星(四十二)" target="_blank">铭刻于星(四十二)</a>
                        <span class="text-muted">随风至</span>

                        <div>69夜晚,绍敏同学做完功课后,看了眼房外,没听到动静才敢从书包的夹层里拿出那个心形纸团。折痕压得很深,都有些旧了,想来是已经写好很久了。绍敏同学慢慢地、轻轻地捏开折叠处,待到全部拆开后,又反复抚平纸张,然后仔细地一字字默看。只是开头的三个字是第一次看到,让她心漏跳了几拍。“亲爱的绍敏:从四年级的时候,我就喜欢你了,但是我一直不敢说,怕影响你学习。六年级的时候听说有人跟你表白,你接受了,我很难过,但</div>
                    </li>
                    <li><a href="/article/1835513570171908096.htm"
                           title="底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说" target="_blank">底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说</a>
                        <span class="text-muted">造命者说</span>

                        <div>底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说我叫吴起,生于公元前440年的战国初期,正是群雄并起、天下纷争不断的时候。后人说我是军事家、政治家、改革家,是兵家代表人物。评价我一生历仕鲁、魏、楚三国,通晓兵家、法家、儒家三家思想,在内政军事上都有极高的成就。周安王二十一年(公元前381年),因变法得罪守旧贵族,被人乱箭射死。我出生在卫国一个“家累万金”的富有家庭,从年轻时候起就不甘平凡</div>
                    </li>
                    <li><a href="/article/1835513571501502464.htm"
                           title="2020-01-25" target="_blank">2020-01-25</a>
                        <span class="text-muted">晴岚85</span>

                        <div>郑海燕坚持分享590天2020.1.24在生活中只存在两个问题。一个问题是:你知道想要达成的目标是什么,但却不知道如何才能达成;另一个问题是:你不知道你的目标是什么。前一个是行动的问题,后一个是结果的问题。通过制定具体的下一步行动,可以解决不知道如何开始行动的问题。而通过去想象结果,对结果做预估,可以解决找不着目标的问题。对于所有吸引我们注意力,想要完成的任务,你可以先想象一下,预期的结果究竟是什</div>
                    </li>
                    <li><a href="/article/1835513568917811200.htm"
                           title="随笔 | 仙一般的灵气" target="_blank">随笔 | 仙一般的灵气</a>
                        <span class="text-muted">海思沧海</span>

                        <div>仙岛今天,我看了你全部,似乎已经进入你的世界我不知道,这是否是梦幻,还是你仙一般的灵气吸引了我也许每一个人都要有一份属于自己的追求,这样才能够符合人生的梦想,生活才能够充满着阳光与快乐我不知道,我为什么会这样的感叹,是在感叹自己的人生,还是感叹自己一直没有孜孜不倦的追求只感觉虚度了光阴,每天活在自己的梦中,活在一个不真实的世界是在逃避自己,还是在逃避周围的一切有时候我嘲笑自己,嘲笑自己如此的虚无,</div>
                    </li>
                    <li><a href="/article/1835513567663714304.htm"
                           title="想家" target="_blank">想家</a>
                        <span class="text-muted">爆米花机</span>

                        <div>也许不同于大家对家乡的思念,我对家乡甚至是疯狂的不舍。还未踏出车站就感觉到幸福,我享受这里的夕阳、这里的浓烈柴火味、这里每一口家常菜。我是宅女,我贪恋家的安逸。刚刚踏出大学校门,初出茅庐,无法适应每年只能国庆和春节回家。我焦虑、失眠、无端发脾气,是无法适应工作的节奏,是无法接受我将一步步离开家乡的事实。我不想承认自己胸无大志,选择再次踏上征程。图片发自App</div>
                    </li>
                    <li><a href="/article/1835513551624695808.htm"
                           title="【iOS】MVC设计模式" target="_blank">【iOS】MVC设计模式</a>
                        <span class="text-muted">Magnetic_h</span>
<a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a>
                        <div>MVC前言如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architecturalpattern),属于编程的方法论。MVC模式就是架构模式的一种。它是Apple官方推荐的App开发架构,也是一般开发者最先遇到、最经典的架构。MVC各层controller层Controller/ViewController/VC(控制器)负责协调Model和View,处理大部分逻辑它将数据从Mod</div>
                    </li>
                    <li><a href="/article/1835513551142350848.htm"
                           title="OC语言多界面传值五大方式" target="_blank">OC语言多界面传值五大方式</a>
                        <span class="text-muted">Magnetic_h</span>
<a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>前言在完成暑假仿写项目时,遇到了许多需要用到多界面传值的地方,这篇博客来总结一下比较常用的五种多界面传值的方式。属性传值属性传值一般用前一个界面向后一个界面传值,简单地说就是通过访问后一个视图控制器的属性来为它赋值,通过这个属性来做到从前一个界面向后一个界面传值。首先在后一个界面中定义属性@interfaceBViewController:UIViewController@propertyNSSt</div>
                    </li>
                    <li><a href="/article/1835513440525971456.htm"
                           title="一百九十四章. 自相矛盾" target="_blank">一百九十四章. 自相矛盾</a>
                        <span class="text-muted">巨木擎天</span>

                        <div>唉!就这么一夜,林子感觉就像过了很多天似的,先是回了阳间家里,遇到了那么多不可思议的事情儿。特别是小伙伴们,第二次与自己见面时,僵硬的表情和恐怖的气氛,让自己如坐针毡,打从心眼里难受!还有东子,他现在还好吗?有没有被人欺负?护城河里的小鱼小虾们,还都在吗?水不会真的干枯了吧?那对相亲相爱漂亮的太平鸟儿,还好吧!春天了,到了做窝、下蛋、喂养小鸟宝宝的时候了,希望它们都能够平安啊!虽然没有看见家人,也</div>
                    </li>
                    <li><a href="/article/1835513424734416896.htm"
                           title="UI学习——cell的复用和自定义cell" target="_blank">UI学习——cell的复用和自定义cell</a>
                        <span class="text-muted">Magnetic_h</span>
<a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>目录cell的复用手动(非注册)自动(注册)自定义cellcell的复用在iOS开发中,单元格复用是一种提高表格(UITableView)和集合视图(UICollectionView)滚动性能的技术。当一个UITableViewCell或UICollectionViewCell首次需要显示时,如果没有可复用的单元格,则视图会创建一个新的单元格。一旦这个单元格滚动出屏幕,它就不会被销毁。相反,它被添</div>
                    </li>
                    <li><a href="/article/1835512920797179904.htm"
                           title="element实现动态路由+面包屑" target="_blank">element实现动态路由+面包屑</a>
                        <span class="text-muted">软件技术NINI</span>
<a class="tag" taget="_blank" href="/search/vue%E6%A1%88%E4%BE%8B/1.htm">vue案例</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi</div>
                    </li>
                    <li><a href="/article/1835512809883004928.htm"
                           title="10月|愿你的青春不负梦想-读书笔记-01" target="_blank">10月|愿你的青春不负梦想-读书笔记-01</a>
                        <span class="text-muted">Tracy的小书斋</span>

                        <div>本书的作者是俞敏洪,大家都很熟悉他了吧。俞敏洪老师是我行业的领头羊吧,也是我事业上的偶像。本日摘录他书中第一章中的金句:『一个人如果什么目标都没有,就会浑浑噩噩,感觉生命中缺少能量。能给我们能量的,是对未来的期待。第一件事,我始终为了进步而努力。与其追寻全世界的骏马,不如种植丰美的草原,到时骏马自然会来。第二件事,我始终有阶段性的目标。什么东西能给我能量?答案是对未来的期待。』读到这里的时候,我便</div>
                    </li>
                    <li><a href="/article/1835512542735200256.htm"
                           title="C语言宏函数" target="_blank">C语言宏函数</a>
                        <span class="text-muted">南林yan</span>
<a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a>
                        <div>一、什么是宏函数?通过宏定义的函数是宏函数。如下,编译器在预处理阶段会将Add(x,y)替换为((x)*(y))#defineAdd(x,y)((x)*(y))#defineAdd(x,y)((x)*(y))intmain(){inta=10;intb=20;intd=10;intc=Add(a+d,b)*2;cout<<c<<endl;//800return0;}二、为什么要使用宏函数使用宏函数</div>
                    </li>
                    <li><a href="/article/1835512305320816640.htm"
                           title="地推话术,如何应对地推过程中家长的拒绝" target="_blank">地推话术,如何应对地推过程中家长的拒绝</a>
                        <span class="text-muted">校师学</span>

                        <div>相信校长们在做地推的时候经常遇到这种情况:市场专员反馈家长不接单,咨询师反馈难以邀约这些家长上门,校区地推疲软,招生难。为什么?仅从地推层面分析,一方面因为家长受到的信息轰炸越来越多,对信息越来越“免疫”;而另一方面地推人员的专业能力和营销话术没有提高,无法应对家长的拒绝,对有意向的家长也不知如何跟进,眼睁睁看着家长走远;对于家长的疑问,更不知道如何有技巧地回答,机会白白流失。由于回答没技巧和专业</div>
                    </li>
                    <li><a href="/article/1835512178023690240.htm"
                           title="谢谢你们,爱你们!" target="_blank">谢谢你们,爱你们!</a>
                        <span class="text-muted">鹿游儿</span>

                        <div>昨天家人去泡温泉,二个孩子也带着去,出发前一晚,匆匆下班,赶回家和孩子一起收拾。饭后,我拿出笔和本子(上次去澳门时做手帐的本子)写下了1\2\3\4\5\6\7\8\9,让后让小壹去思考,带什么出发去旅游呢?她在对应的数字旁边画上了,泳衣、泳圈、肖恩、内衣内裤、tapuy、拖鞋……画完后,就让她自己对着这个本子,将要带的,一一带上,没想到这次带的书还是这本《便便工厂》(晚上姑婆发照片过来,妹妹累得</div>
                    </li>
                    <li><a href="/article/1835511911769272320.htm"
                           title="C语言如何定义宏函数?" target="_blank">C语言如何定义宏函数?</a>
                        <span class="text-muted">小九格物</span>
<a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a>
                        <div>在C语言中,宏函数是通过预处理器定义的,它在编译之前替换代码中的宏调用。宏函数可以模拟函数的行为,但它们不是真正的函数,因为它们在编译时不会进行类型检查,也不会分配存储空间。宏函数的定义通常使用#define指令,后面跟着宏的名称和参数列表,以及宏展开后的代码。宏函数的定义方式:1.基本宏函数:这是最简单的宏函数形式,它直接定义一个表达式。#defineSQUARE(x)((x)*(x))2.带参</div>
                    </li>
                    <li><a href="/article/1835511912192897024.htm"
                           title="微服务下功能权限与数据权限的设计与实现" target="_blank">微服务下功能权限与数据权限的设计与实现</a>
                        <span class="text-muted">nbsaas-boot</span>
<a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>在微服务架构下,系统的功能权限和数据权限控制显得尤为重要。随着系统规模的扩大和微服务数量的增加,如何保证不同用户和服务之间的访问权限准确、细粒度地控制,成为设计安全策略的关键。本文将讨论如何在微服务体系中设计和实现功能权限与数据权限控制。1.功能权限与数据权限的定义功能权限:指用户或系统角色对特定功能的访问权限。通常是某个用户角色能否执行某个操作,比如查看订单、创建订单、修改用户资料等。数据权限:</div>
                    </li>
                    <li><a href="/article/1835511912843014144.htm"
                           title="理解Gunicorn:Python WSGI服务器的基石" target="_blank">理解Gunicorn:Python WSGI服务器的基石</a>
                        <span class="text-muted">范范0825</span>
<a class="tag" taget="_blank" href="/search/ipython/1.htm">ipython</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico</div>
                    </li>
                    <li><a href="/article/1835511669476913152.htm"
                           title="小丽成长记(四十三)" target="_blank">小丽成长记(四十三)</a>
                        <span class="text-muted">玲玲54321</span>

                        <div>小丽发现,即使她好不容易调整好自己的心态下一秒总会有不确定的伤脑筋的事出现,一个接一个的问题,人生就没有停下的时候,小问题不断出现。不过她今天看的书,她接受了人生就是不确定的,厉害的人就是不断创造确定性,在Ta的领域比别人多的确定性就能让自己脱颖而出,显示价值从而获得的比别人多的利益。正是这样的原因,因为从前修炼自己太少,使得她现在在人生道路上打怪起来困难重重,她似乎永远摆脱不了那种无力感,有种习</div>
                    </li>
                    <li><a href="/article/1835511542284644352.htm"
                           title="学点心理知识,呵护孩子健康" target="_blank">学点心理知识,呵护孩子健康</a>
                        <span class="text-muted">静候花开_7090</span>

                        <div>昨天听了华中师范大学教育管理学系副教授张玲老师的《哪里才是学生心理健康的最后庇护所,超越教育与技术的思考》的讲座。今天又重新学习了一遍,收获匪浅。张玲博士也注意到了当今社会上的孩子由于心理问题导致的自残、自杀及伤害他人等恶性事件。她向我们普及了一个重要的命题,她说心理健康的一些基本命题,我们与我们通常的一些教育命题是不同的,她还举了几个例子,让我们明白我们原来以为的健康并非心理学上的健康。比如如果</div>
                    </li>
                    <li><a href="/article/1835511163450912768.htm"
                           title="2021年12月19日,春蕾教育集团团建活动感受——黄晓丹" target="_blank">2021年12月19日,春蕾教育集团团建活动感受——黄晓丹</a>
                        <span class="text-muted">黄错错加油</span>

                        <div>感受:1.从陌生到熟悉的过程。游戏环节让我们在轻松的氛围中得到了锻炼,也增长了不少知识。2.游戏过程中,我们贡献的是个人力量,展现的是团队的力量。它磨合的往往不止是工作的熟悉,更是观念上契合度的贴近。3.这和工作是一样的道理。在各自的岗位上,每个人摆正自己的位置、各司其职充分发挥才能,并团结一致劲往一处使,才能实现最大的成功。新知:1.团队精神需要不断地创新。过去,人们把创新看作是冒风险,现在人们</div>
                    </li>
                    <li><a href="/article/1835511036317364224.htm"
                           title="Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断" target="_blank">Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断</a>
                        <span class="text-muted">尐尐呅</span>

                        <div>结核病是艾滋病合并其他疾病中导致患者死亡的主要原因。其中结核病由结核分枝杆菌(Mycobacteriumtuberculosis,Mtb)感染引起,获得性免疫缺陷综合症(艾滋病)由人免疫缺陷病毒(Humanimmunodeficiencyvirustype1,HIV-1)感染引起。国家感染性疾病临床医学研究中心/深圳市第三人民医院张国良团队携手深圳华大生命科学研究院吴靓团队,共同研究得出单细胞测序</div>
                    </li>
                    <li><a href="/article/1835511030260789248.htm"
                           title="c++ 的iostream 和 c++的stdio的区别和联系" target="_blank">c++ 的iostream 和 c++的stdio的区别和联系</a>
                        <span class="text-muted">黄卷青灯77</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/iostream/1.htm">iostream</a><a class="tag" taget="_blank" href="/search/stdio/1.htm">stdio</a>
                        <div>在C++中,iostream和C语言的stdio.h都是用于处理输入输出的库,但它们在设计、用法和功能上有许多不同。以下是两者的区别和联系:区别1.编程风格iostream(C++风格):C++标准库中的输入输出流类库,支持面向对象的输入输出操作。典型用法是cin(输入)和cout(输出),使用>操作符来处理数据。更加类型安全,支持用户自定义类型的输入输出。#includeintmain(){in</div>
                    </li>
                    <li><a href="/article/1835510909070569472.htm"
                           title="瑶池防线" target="_blank">瑶池防线</a>
                        <span class="text-muted">谜影梦蝶</span>

                        <div>冥华虽然逃过了影梦的军队,但他是一个忠臣,他选择上报战况。败给影梦后成逃兵,高层亡尔还活着,七重天失守......随便一条,即可处死冥华。冥华自然是知道以仙界高层的习性此信一发自己必死无疑,但他还选择上报实情,因为责任。同样此信送到仙宫后,知道此事的人,大多数人都认定冥华要完了,所以上到仙界高层,下到扫大街的,包括冥华自己,全都准备好迎接冥华之死。如果仙界现在还属于两方之争的话,冥华必死无疑。然而</div>
                    </li>
                    <li><a href="/article/1835510656011431936.htm"
                           title="爬山后遗症" target="_blank">爬山后遗症</a>
                        <span class="text-muted">璃绛</span>

                        <div>爬山,攀登,一步一步走向制高点,是一种挑战。成功抵达是一种无法言语的快乐,在山顶吹吹风,看看风景,这是从未有过的体验。然而,爬山一时爽,下山腿打颤,颠簸的路,一路向下走,腿部力量不够,走起来抖到不行,停不下来了!第二天必定腿疼,浑身酸痛,坐立难安!</div>
                    </li>
                                <li><a href="/article/112.htm"
                                       title="HQL之投影查询" target="_blank">HQL之投影查询</a>
                                    <span class="text-muted">归来朝歌</span>
<a class="tag" taget="_blank" href="/search/HQL/1.htm">HQL</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5/1.htm">查询语句</a><a class="tag" taget="_blank" href="/search/%E6%8A%95%E5%BD%B1%E6%9F%A5%E8%AF%A2/1.htm">投影查询</a>
                                    <div>        在HQL查询中,常常面临这样一个场景,对于多表查询,是要将一个表的对象查出来还是要只需要每个表中的几个字段,最后放在一起显示? 
针对上面的场景,如果需要将一个对象查出来: 
HQL语句写“from 对象”即可 
Session session = HibernateUtil.openSession();
		</div>
                                </li>
                                <li><a href="/article/239.htm"
                                       title="Spring整合redis" target="_blank">Spring整合redis</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a>
                                    <div>pom.xml 
 

<dependencies>
		<!-- Spring Data - Redis Library -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redi</div>
                                </li>
                                <li><a href="/article/366.htm"
                                       title="org.hibernate.NonUniqueResultException: query did not return a unique result: 2" target="_blank">org.hibernate.NonUniqueResultException: query did not return a unique result: 2</a>
                                    <span class="text-muted">0624chenhong</span>
<a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a>
                                    <div>参考:http://blog.csdn.net/qingfeilee/article/details/7052736 
org.hibernate.NonUniqueResultException: query did not return a unique result: 2 
        在项目中出现了org.hiber</div>
                                </li>
                                <li><a href="/article/493.htm"
                                       title="android动画效果" target="_blank">android动画效果</a>
                                    <span class="text-muted">不懂事的小屁孩</span>
<a class="tag" taget="_blank" href="/search/android%E5%8A%A8%E7%94%BB/1.htm">android动画</a>
                                    <div>前几天弄alertdialog和popupwindow的时候,用到了android的动画效果,今天专门研究了一下关于android的动画效果,列出来,方便以后使用。 
 
Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。 
第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似。 
 
</div>
                                </li>
                                <li><a href="/article/620.htm"
                                       title="js delete 删除机理以及它的内存泄露问题的解决方案" target="_blank">js delete 删除机理以及它的内存泄露问题的解决方案</a>
                                    <span class="text-muted">换个号韩国红果果</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>delete删除属性时只是解除了属性与对象的绑定,故当属性值为一个对象时,删除时会造成内存泄露  (其实还未删除) 
举例: 

var person={name:{firstname:'bob'}}
var p=person.name
delete person.name
p.firstname  -->'bob'
// 依然可以访问p.firstname,存在内存泄露</div>
                                </li>
                                <li><a href="/article/747.htm"
                                       title="Oracle将零干预分析加入网络即服务计划" target="_blank">Oracle将零干预分析加入网络即服务计划</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>由Oracle通信技术部门主导的演示项目并没有在本月较早前法国南斯举行的行业集团TM论坛大会中获得嘉奖。但是,Oracle通信官员解雇致力于打造一个支持零干预分配和编制功能的网络即服务(NaaS)平台,帮助企业以更灵活和更适合云的方式实现通信服务提供商(CSP)的连接产品。这个Oracle主导的项目属于TM Forum Live!活动上展示的Catalyst计划的19个项目之一。Catalyst计</div>
                                </li>
                                <li><a href="/article/874.htm"
                                       title="spring学习——springmvc(二)" target="_blank">spring学习——springmvc(二)</a>
                                    <span class="text-muted">a-john</span>
<a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a>
                                    <div>Spring MVC提供了非常方便的文件上传功能。 
1,配置Spring支持文件上传: 
DispatcherServlet本身并不知道如何处理multipart的表单数据,需要一个multipart解析器把POST请求的multipart数据中抽取出来,这样DispatcherServlet就能将其传递给我们的控制器了。为了在Spring中注册multipart解析器,需要声明一个实现了Mul</div>
                                </li>
                                <li><a href="/article/1001.htm"
                                       title="POJ-2828-Buy Tickets" target="_blank">POJ-2828-Buy Tickets</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/ACM_POJ/1.htm">ACM_POJ</a>
                                    <div>POJ-2828-Buy Tickets 
http://poj.org/problem?id=2828 
线段树,逆序插入 
 
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;#define N 200010struct</div>
                                </li>
                                <li><a href="/article/1128.htm"
                                       title="Java Ant build.xml详解" target="_blank">Java Ant build.xml详解</a>
                                    <span class="text-muted">asia007</span>
<a class="tag" taget="_blank" href="/search/build.xml/1.htm">build.xml</a>
                                    <div>1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因为ant是使用java实现的,所以它跨平台使用简单--与ant的兄弟make比起来语法清晰--同样是和make相比功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有</div>
                                </li>
                                <li><a href="/article/1255.htm"
                                       title="android按钮监听器的四种技术" target="_blank">android按钮监听器的四种技术</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/xml%E9%85%8D%E7%BD%AE/1.htm">xml配置</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E5%90%AC%E5%99%A8/1.htm">监听器</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E7%8E%B0%E6%8E%A5%E5%8F%A3/1.htm">实现接口</a>
                                    <div>android开发中经常会用到各种各样的监听器,android监听器的写法与java又有不同的地方;  
  
1,activity中使用内部类实现接口 ,创建内部类实例  使用add方法  与java类似 
  
创建监听器的实例 
myLis lis = new myLis(); 
  
使用add方法给按钮添加监听器 
 </div>
                                </li>
                                <li><a href="/article/1382.htm"
                                       title="软件架构师不等同于资深程序员" target="_blank">软件架构师不等同于资深程序员</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E5%B8%88/1.htm">架构师</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/1.htm">架构设计</a>
                                    <div>        本文的作者Armel Nene是ETAPIX Global公司的首席架构师,他居住在伦敦,他参与过的开源项目包括 Apache Lucene,,Apache Nutch, Liferay 和 Pentaho等。 
        如今很多的公司</div>
                                </li>
                                <li><a href="/article/1509.htm"
                                       title="TeamForge Wiki Syntax & CollabNet User Information Center" target="_blank">TeamForge Wiki Syntax & CollabNet User Information Center</a>
                                    <span class="text-muted">sunjing</span>
<a class="tag" taget="_blank" href="/search/TeamForge/1.htm">TeamForge</a><a class="tag" taget="_blank" href="/search/How+do/1.htm">How do</a><a class="tag" taget="_blank" href="/search/Attachement/1.htm">Attachement</a><a class="tag" taget="_blank" href="/search/Anchor/1.htm">Anchor</a><a class="tag" taget="_blank" href="/search/Wiki+Syntax/1.htm">Wiki Syntax</a>
                                    <div>the CollabNet user information center http://help.collab.net/ 
  
How do I create a new Wiki page? 
A CollabNet TeamForge project can have any number of Wiki pages. All Wiki pages are linked, and</div>
                                </li>
                                <li><a href="/article/1636.htm"
                                       title="【Redis四】Redis数据类型" target="_blank">【Redis四】Redis数据类型</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a>
                                    <div>概述 
Redis是一个高性能的数据结构服务器,称之为数据结构服务器的原因是,它提供了丰富的数据类型以满足不同的应用场景,本文对Redis的数据类型以及对这些类型可能的操作进行总结。 
Redis常用的数据类型包括string、set、list、hash以及sorted set.Redis本身是K/V系统,这里的数据类型指的是value的类型,而不是key的类型,key的类型只有一种即string</div>
                                </li>
                                <li><a href="/article/1763.htm"
                                       title="SSH2整合-附源码" target="_blank">SSH2整合-附源码</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a>
                                    <div>今天用eclipse终于整合出了struts2+hibernate+spring框架。 
我创建的是tomcat项目,需要有tomcat插件。导入项目以后,鼠标右键选择属性,然后再找到“tomcat”项,勾选一下“Is a tomcat project”即可。具体方法见源码里的jsp图片,sql也在源码里。 
  
  
补充1:项目中部分jar包不是最新版的,可能导</div>
                                </li>
                                <li><a href="/article/1890.htm"
                                       title="[转]开源项目代码的学习方法" target="_blank">[转]开源项目代码的学习方法</a>
                                    <span class="text-muted">braveCS</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95/1.htm">学习方法</a>
                                    <div>转自: 
http://blog.sina.com.cn/s/blog_693458530100lk5m.html 
http://www.cnblogs.com/west-link/archive/2011/06/07/2074466.html 
  
1)阅读features。以此来搞清楚该项目有哪些特性2)思考。想想如果自己来做有这些features的项目该如何构架3)下载并安装d</div>
                                </li>
                                <li><a href="/article/2017.htm"
                                       title="编程之美-子数组的最大和(二维)" target="_blank">编程之美-子数组的最大和(二维)</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a>
                                    <div>package beautyOfCoding;

import java.util.Arrays;
import java.util.Random;

public class MaxSubArraySum2 {

	/**
	 * 编程之美 子数组之和的最大值(二维)
	 */
	private static final int ROW = 5;
	private stat</div>
                                </li>
                                <li><a href="/article/2144.htm"
                                       title="读书笔记-3" target="_blank">读书笔记-3</a>
                                    <span class="text-muted">chengxuyuancsdn</span>
<a class="tag" taget="_blank" href="/search/jquery%E7%AC%94%E8%AE%B0/1.htm">jquery笔记</a><a class="tag" taget="_blank" href="/search/resultMap%E9%85%8D%E7%BD%AE/1.htm">resultMap配置</a><a class="tag" taget="_blank" href="/search/ibatis%E4%B8%80%E5%AF%B9%E5%A4%9A%E9%85%8D%E7%BD%AE/1.htm">ibatis一对多配置</a>
                                    <div>1、resultMap配置 
2、ibatis一对多配置 
3、jquery笔记 
 
1、resultMap配置
当<select resultMap="topic_data">
<resultMap id="topic_data">必须一一对应。
(1)<resultMap class="tblTopic&q</div>
                                </li>
                                <li><a href="/article/2271.htm"
                                       title="[物理与天文]物理学新进展" target="_blank">[物理与天文]物理学新进展</a>
                                    <span class="text-muted">comsci</span>

                                    <div> 
 
      如果我们必须获得某种地球上没有的矿石,才能够进行某些能量输出装置的设计和建造,而要获得这种矿石,又必须首先进行深空探测,而要进行深空探测,又必须获得这种能量输出装置,这个矛盾的循环,会导致地球联盟在与宇宙文明建立关系的时候,陷入困境 
 
      怎么办呢? 
 
 </div>
                                </li>
                                <li><a href="/article/2398.htm"
                                       title="Oracle 11g新特性:Automatic Diagnostic Repository" target="_blank">Oracle 11g新特性:Automatic Diagnostic Repository</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/ADR/1.htm">ADR</a>
                                    <div>Oracle Database 11g的FDI(Fault Diagnosability Infrastructure)是自动化诊断方面的又一增强。 
FDI的一个关键组件是自动诊断库(Automatic Diagnostic Repository-ADR)。 
 
在oracle 11g中,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。 
这两份log文</div>
                                </li>
                                <li><a href="/article/2525.htm"
                                       title="简单排序:选择排序" target="_blank">简单排序:选择排序</a>
                                    <span class="text-muted">dieslrae</span>
<a class="tag" taget="_blank" href="/search/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F/1.htm">选择排序</a>
                                    <div>
    public void selectSort(int[] array){
        int select;
        
        for(int i=0;i<array.length;i++){
            select = i;
            
            for(int k=i+1;k<array.leng</div>
                                </li>
                                <li><a href="/article/2652.htm"
                                       title="C语言学习六指针的经典程序,互换两个数字" target="_blank">C语言学习六指针的经典程序,互换两个数字</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a>
                                    <div>示例程序,swap_1和swap_2都是错误的,推理从1开始推到2,2没完成,推到3就完成了 
# include <stdio.h>

void swap_1(int, int);
void swap_2(int *, int *);
void swap_3(int *, int *);

int main(void)
{
	int a = 3;
	int b = </div>
                                </li>
                                <li><a href="/article/2779.htm"
                                       title="php 5.4中php-fpm 的重启、终止操作命令" target="_blank">php 5.4中php-fpm 的重启、终止操作命令</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                    <div>php 5.4中php-fpm 的重启、终止操作命令: 
查看php运行目录命令:which php/usr/bin/php 
查看php-fpm进程数:ps aux | grep -c php-fpm 
查看运行内存/usr/bin/php  -i|grep mem 
重启php-fpm/etc/init.d/php-fpm restart 
在phpinfo()输出内容可以看到php</div>
                                </li>
                                <li><a href="/article/2906.htm"
                                       title="线程同步工具类" target="_blank">线程同步工具类</a>
                                    <span class="text-muted">shuizhaosi888</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8C%E6%AD%A5%E5%B7%A5%E5%85%B7%E7%B1%BB/1.htm">同步工具类</a>
                                    <div>同步工具类包括信号量(Semaphore)、栅栏(barrier)、闭锁(CountDownLatch) 
  
闭锁(CountDownLatch) 
public class RunMain {
	public long timeTasks(int nThreads, final Runnable task) throws InterruptedException {
		fin</div>
                                </li>
                                <li><a href="/article/3033.htm"
                                       title="bleeding edge是什么意思" target="_blank">bleeding edge是什么意思</a>
                                    <span class="text-muted">haojinghua</span>
<a class="tag" taget="_blank" href="/search/DI/1.htm">DI</a>
                                    <div>不止一次,看到很多讲技术的文章里面出现过这个词语。今天终于弄懂了——通过朋友给的浏览软件,上了wiki。  
我再一次感到,没有辞典能像WiKi一样,给出这样体贴人心、一清二楚的解释了。为了表达我对WiKi的喜爱,只好在此一一中英对照,给大家上次课。 
  
In computer science, bleeding edge is a term that </div>
                                </li>
                                <li><a href="/article/3160.htm"
                                       title="c中实现utf8和gbk的互转" target="_blank">c中实现utf8和gbk的互转</a>
                                    <span class="text-muted">jimmee</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/iconv/1.htm">iconv</a><a class="tag" taget="_blank" href="/search/utf8%26gbk%E7%BC%96%E7%A0%81/1.htm">utf8&gbk编码</a>
                                    <div>#include <iconv.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>

int code_c</div>
                                </li>
                                <li><a href="/article/3287.htm"
                                       title="大型分布式网站架构设计与实践" target="_blank">大型分布式网站架构设计与实践</a>
                                    <span class="text-muted">lilin530</span>
<a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a>
                                    <div>1.大型网站软件系统的特点? 
a.高并发,大流量。 
b.高可用。 
c.海量数据。 
d.用户分布广泛,网络情况复杂。 
e.安全环境恶劣。 
f.需求快速变更,发布频繁。 
g.渐进式发展。 
 
2.大型网站架构演化发展历程? 
a.初始阶段的网站架构。 
应用程序,数据库,文件等所有的资源都在一台服务器上。 
b.应用服务器和数据服务器分离。 
c.使用缓存改善网站性能。 
d.使用应用</div>
                                </li>
                                <li><a href="/article/3414.htm"
                                       title="在代码中获取Android theme中的attr属性值" target="_blank">在代码中获取Android theme中的attr属性值</a>
                                    <span class="text-muted">OliveExcel</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/theme/1.htm">theme</a>
                                    <div>Android的Theme是由各种attr组合而成, 每个attr对应了这个属性的一个引用, 这个引用又可以是各种东西. 
  
在某些情况下, 我们需要获取非自定义的主题下某个属性的内容 (比如拿到系统默认的配色colorAccent), 操作方式举例一则: 
int defaultColor = 0xFF000000;
int[] attrsArray = { andorid.r.</div>
                                </li>
                                <li><a href="/article/3541.htm"
                                       title="基于Zookeeper的分布式共享锁" target="_blank">基于Zookeeper的分布式共享锁</a>
                                    <span class="text-muted">roadrunners</span>
<a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E5%85%B1%E4%BA%AB%E9%94%81/1.htm">共享锁</a>
                                    <div>首先,说说我们的场景,订单服务是做成集群的,当两个以上结点同时收到一个相同订单的创建指令,这时并发就产生了,系统就会重复创建订单。等等......场景。这时,分布式共享锁就闪亮登场了。 
  
共享锁在同一个进程中是很容易实现的,但在跨进程或者在不同Server之间就不好实现了。Zookeeper就很容易实现。具体的实现原理官网和其它网站也有翻译,这里就不在赘述了。 
  
官</div>
                                </li>
                                <li><a href="/article/3668.htm"
                                       title="两个容易被忽略的MySQL知识" target="_blank">两个容易被忽略的MySQL知识</a>
                                    <span class="text-muted">tomcat_oracle</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>1、varchar(5)可以存储多少个汉字,多少个字母数字?     相信有好多人应该跟我一样,对这个已经很熟悉了,根据经验我们能很快的做出决定,比如说用varchar(200)去存储url等等,但是,即使你用了很多次也很熟悉了,也有可能对上面的问题做出错误的回答。     这个问题我查了好多资料,有的人说是可以存储5个字符,2.5个汉字(每个汉字占用两个字节的话),有的人说这个要区分版本,5.0</div>
                                </li>
                                <li><a href="/article/3795.htm"
                                       title="zoj 3827 Information Entropy(水题)" target="_blank">zoj 3827 Information Entropy(水题)</a>
                                    <span class="text-muted">阿尔萨斯</span>
<a class="tag" taget="_blank" href="/search/format/1.htm">format</a>
                                    <div> 题目链接:zoj 3827 Information Entropy 
 题目大意:三种底,计算和。 
 解题思路:调用库函数就可以直接算了,不过要注意Pi = 0的时候,不过它题目里居然也讲了。。。limp→0+plogb(p)=0,因为p是logp的高阶。 
#include <cstdio>
#include <cstring>
#include <cmath&</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>