Javascript – 正则表达式

目录

1正则表达式

正则表达式本身就是一种语言,由普通字符和特殊的元字符(metacharacters)组成。它描述了字符串的匹配模式,用于转换和处理字符串。

其中,元字符(metacharacters)也是由普通字符组成,具有特殊意义。比如 {3} 代表了将前面的字符或分组重复匹配三次,$ 代表了匹配一行的结束位置。(更多的元字符请看下面的 表格。)

正则表达式常被用来执行复杂的 “搜索-替换” 、验证字符串格式是否正确。

当今的大多数程序设计语言都包含正则表达式。甚至包括脚本语言、编辑器、应用程序、数据库和一些命令行的工具也包含正则表达式工具。下面介绍 Javascript 中实现正则表达式的 Regex 对象。

1.1 创建

Regex 是 Javascript 的内置对象,描述一个字符串的匹配模式,为字符串操作提供了强大的匹配和替换方法。

和数组、对象差不多,Regex 对象的创建也有常量、构造函数、普通函数三种创建方式:

直接量语法

/pattern/attributes

构造函数

new RegExp( pattern , attributes ) ;

普通函数

RegExp( pattern , attributes ) ;

其中的 pattern 是正则表达式的匹配模式,由字符和元字符(表格)构成,attributes 是正则表达式的标记,可以是 "i""g""m" 三个字母或三个字符的任意组合:

  • "i":大小写不敏感
  • "g":全局匹配(查找所有匹配而非在找到第一个匹配后停止)
  • "m":多行匹配

在使用函数创建正则表达式的时候,如果 pattern 不是一个字符串,而是一个正则表达式,则忽略第二个参数:

var a = /ch/ig ;
var b = new RegExp( /ch/ig) ;
var c = RegExp( "ch" , "ig" ) ;

1.2 对象属性

  • regexOjbect.source 属性是一个只读的字符串,包含了描述这个正则表达式的文本;
  • regexOjbect.global 属性是一个只读的布尔值,表明这个正则表达式是否为具有标识 "g"
  • regexOjbect.ignoreCase 属性是一个只读的布尔值,表明这个正则表达式是否为具有标识 "i"
  • regexOjbect.multiline 属性是一个只读的布尔值,表明这个正则表达式是否为具有标识 "m"
  • regexOjbect.lastIndex 属性是一个数值,如果正则表达式有 “g” 标识,这个属性表明下一次检索的起始位置。
var reg = /ch/g ;
var testString = "String type contains one char or a set of chars."
alert( reg.source ) ; // "ch"
alert( reg.global ) ; // true
alert( reg.ignoreCase) ; // false
alert( reg.multiline) ; // false
alert( reg.lastIndex) ; // 0
reg.test( testString  ) ; // true
alert( reg.lastIndex) ; // 27
reg.test( testString  ) ; // true
alert( reg.lastIndex) ; // 44
reg.test( testString  ) ; // false
alert( reg.lastIndex) ; // 0

可以看到,当正则表达式匹配结束或失败时,regexOjbect.lastIndex 被重置。

1.3 对象方法

test

Regex.test 方法测试正则表达式指定的模式是否出现在字符串中,返回 truefalse

var a = /ch/ig ;
a.test( "chinses " ) ; // true
a.test( "abc") ; // false

compile

Regex.compile 方法可以在脚本执行过程中编译正则表达式,也可以改变和重新编译正则表达式。形式如下:

RegExpObject.compile( regexp , attributes ) ;

regexp 是一个正则表达式,用于替换 RegExpObject

modifier 是正则表达式的匹配属性( "i" / "g" / "i" )。

如果缺省参数,RegExpObject 被重置为一个空的正则表达式 //

var reg = /man/ ;
"I'm woman !".replace( reg , "child" ) ; // "I'm wochild !"
reg.compile( /(wo)?man/ ) ;
"I'm woman !".replace( reg , "child" ) ; // "I'm child !"

如果 regexp 是正则表达式本身,结果就是重新编译并重置它的属性,比如 lastIndex

exec

Regex.exec 方法用于检索字符串中正则表达式的匹配。形式如下:

var ResultArray = RegExpObject.exec( string ) ; 

Regex.exec 方法返回一个数组:

  • 数组的元素,就是匹配的结果;
  • 数组的属性 index 表示匹配发生的位置,input 表示原始字符串;
  • 未找到匹配返回 null,而不是空数组 [ ]

执行 exec 后:

  • 如果匹配成功,正则表达式的属性 lastIndex 设为匹配文本后面的位置;
  • 如果匹配失败,正则表达式的属性 lastIndex 设为 0 。

非全局匹配的情况下,exec 的返回结果和 String.match 相同。

[ 匹配的结果 ,1 个子表达式匹配的结果 , 第二个..... , 第 n 个子表达式匹配的结果 ]

全局匹配的情况下,可以通过反复调用 exec 方法来遍历字符串中的所有匹配文本。

var str = "30-AC-F6-B1-EC-14" ;
var reg = /(\d{2})|([A-Z]{2})/g ;
reg.exec( str ) ; // [ "30" , "30" , undefined ] 
alert( reg.lastIndex ) ; //  2
// 在 "30" 这个匹配结果中, \d{2} 匹配到了 "30", [A-Z]{2} 匹配失败。
reg.exec( str ) ; // [ "AC" , undefined , "AC" ] 
alert( reg.lastIndex ) ; // 5

for 来遍历:

var str = "30-AC-F6-B1-EC-14" ;
var reg = /(\d{2})|([A-Z]{2})/g ;
var match = reg .exec( str ) ;
var numberArr = [ ] ;
var literalArr = [ ] ;
while( match ){if( match[ 1 ] )numberArr.push( match[ 1 ] );if( match[ 2 ] )literalArr.push( match[ 2 ] ); match = reg .exec( str ) ;       
}
alert("数字:"+ numberArr + "   字母:" + literalArr );

1.4 分组

正则表达式中,使用括号 ( ) 进行分组。

分组的正则表达式有两个作用:一是可以让重复的模式作用于整个组而不是单一字符,另一个是可以用特殊转义序列对其进行引用。

var reg = /^(.).*\1$/ ; // 匹配开头和结尾字符相同的字符串
reg.test( "seats" ) ; // true

其中使用 \n 引用前面第 n捕获子表达式 的捕获结果。

分组的捕获结果,还可以用 RegExp 的静态属性 $1...$9 引用。在 string.replace 方法中:

var reg = /(\d+)/g ; // 匹配数字
"var a = 98 + 23 ;".replace( reg , "<i>$1</i>") ; // "var a = <i>98</i> + <i>23</i> ;"

string.replacereplacement 参数中 "$1" ... "$9" 拥有特殊意义,引用模式匹配过程中 捕获子表达式 捕获的结果。

也可以在 replacement 外使用 RegExp.$1 ... RegExp.$9 访问对应分组捕获的结果。

var reg = /(\d+)/g ; // 匹配数字
"var a = 98 + 23 ;".replace( reg , "<i>" + RegExp.$1 + "</i>") ; // "var a = <i>98</i> + <i>23</i> ;"
var reg = /(\d+)-(\d+)/g ; 
reg.exec( "021-88776655,010-99585960" ) ; // ["021-88776655", "021", "88776655"]
alert( "区号:" + RegExp.$1 + " 号码:" + RegExp.$2 ) ; // 区号:021 号码:88776655
reg.exec( "021-88776655,010-99585960" ) ; // ["010-99585960", "010", "99585960"]
alert( "区号:" + RegExp.$1 + " 号码:" + RegExp.$2 ) ; // 区号:010 号码:99585960

2元字符和正则表达式规则

CharacterDescription
\
\ 标志着下一个字符是一个特殊的字符。元字符拥有特殊的意义,如果想使用这些字符,需用 \ 转义:
var reg1 = /\{/ ; // 匹配大括号
var reg2 = /\(/ ; // 匹配分组符号
var reg3 = /\[/ ; // 匹配中括号
var reg4 = /\\/ ; // 匹配反斜杠
var reg5 = /\n/ ; // 匹配换行符
^
^ 匹配字符串的开始位置。如果进行多行(Multiline)匹配,^ 也会匹配 \n\r 后面的位置。
var reg = /^a/ ;
reg.test( "ab" ) ; // true
reg.test( "ba" ) ; // false
reg = "abc\ndef\rghi" ;
reg.replace( /^/gm , "-" ) ; //"-abc\n-def\r-ghi"
$
$ 匹配字符串的结束位置。如果进行多行(Multiline)匹配,$ 也会匹配 \n\r 前面的位置。
var reg = /a$/ ;
reg.test( "ab" ) ; // false
reg.test( "ba" ) ; // true
reg = "abc\ndef\rghi" ;
reg.replace( /$/gm , "-" ) ; //"abc-\ndef-\rghi-"
*
* 匹配前面的字符或者分组 0 次或多次。如 zo* 匹配 “zo” 和 “zoo”,甚至是 “z”。

 

+ 等价于 {1,}

var reg = /zo*/ ; // 或者 /zo{0,}/
reg.test( "zoo" ) ; // true
reg.test( "zo" ) ; // true
reg.test( "z" ) ; // true
reg.test( "loo" ) ; // false
+
+ 匹配前面的字符或者分组 1 次或多次。如 zo+ 匹配 “zo” 和 “zoo”,但不匹配 “z”。

 

+ 等价于 {1,}

var reg = /zo+/ ; // 或者 /zo{1,}/
reg.test( "zoo" ) ; // true
reg.test( "zo" ) ; // true
reg.test( "z" ) ; // false
reg.test( "loo" ) ; // false
?
? 匹配前面的字符或者分组 1 次或多次。如 do(es)? 匹配 “do” 和 “does” 。

 

? 等价于 {0,1}

var reg = /do(es)?/ ; // 或者 /do(es){0,1}/
reg.test( "do" ) ; // true
reg.test( "does" ) ; // true
reg.test( "to" ) ; // false
{n}
{n} 匹配前面的字符或者分组 n 次。其中 n 是非负整数。如 o{2} 匹配 "food" 的 2 个 "o" ,不匹配 "do" 中的 1 个 "o"
var reg = /o{2}/ ; 
reg.test( "too" ) ; // true
reg.test( "food" ) ; // true
reg.test( "to do" ) ; // false
{n,}
{n,} 匹配前面的字符或者分组至少 n 次。其中 n 是非负整数。如 o{1} 匹配 "yahoo" 的 2 个 "o" ,也匹配 "yahooooooooo"中的所有 "o"

 

{1,} 等价于 +

var reg = /o{2}/ ; 
reg.test( "google" ) ; // true
reg.test( "yahooooo" ) ; // true
reg.test( "to do" ) ; // false
{n,m}
{n,m} 匹配前面的字符或者分组至少 n 次、至多 m 次。其中 nm 都是非负整数。如 o{1,3} 匹配 "yahoo" 的前 3 个 "o" ,也匹配 "yahooooooooo"中的前 3 个 "o"

 

{0,1} 等价于 ?

注意:数字和逗号之间不能有空格。

var reg = /o{2}/ ; 
reg.test( "google" ) ; // true
reg.test( "yahooooo" ) ; // true
reg.test( "to do" ) ; // false
?
其实 ? 有两个用途。

 

第一个用途上面提到了,用来匹配前面字符或分组 0 次或 1 次。

第二个用途,用在其他量词(比如 * , + , ? , {n} , {n,} , {n,m})的后面,指示匹配模式为 “非贪婪匹配”,与之相反,默认匹配规则是 “贪婪匹配”,即尽量匹配更多的字符。比如,o+ 匹配 “ooooo” 中的全部 “o”,而 o+? 匹配第一个 “o”。

var reg = /o+?/ ; 
reg.test( "google" ) ; // true
reg.test( "yahooooo" ) ; // true
reg.test( "to do" ) ; // true
.
. 匹配除了 "\n" 外的任何字符。

 

想要匹配 "\n" 可以使用 [\s\S]

var reg = /^a.*a$/ ; // 匹配一行首尾都是 a 的字符串
reg.test( "abcdefga" ) ; // true
reg.test( "abc") ; // false
(pattern)
(pattern) 匹配模式 pattern 并捕获结果。

 

RegExp.exec 返回的数组中:

  • 第一个元素是整个正则表达式匹配到的字符串;
  • 后面的元素,依次是针对该次匹配的子表达式 pattern 匹配结果。
  • 想要子表达式捕获结果,需要用 ( ) 包围起来。
var reg = /ch/ ; // 没有子表达式
reg.exec( "chese" ) ; // [ "ch" ]
reg = /(c)(h)/ ; 
reg.exec( "chese" ) ; // [ "ch" , "c" , "h" ]
reg = /(ch)/ ; 
reg.exec( "chese" ) ; // [ "ch" , "ch" ]
reg = /(ch)|(ese)|(en)/ ; 
reg.exec( "chese" ) ; // [ "ch" , "ch" , undefined , undefined ]
(?:pattern)
(?:pattern) 匹配模式 pattern 并但不捕获结果。

 

( ) 有时并不是为了捕获,而仅仅为了 “分组”,这时可以用这个元字符。

var reg = /^.*(?:\.|。)$/ ; 匹配以句号结尾的字符串
reg.exec( "Hello !" ) ; // null
reg.exec( "To be continued ." ) ; // ["To be continued ."]
(?=pattern)
(?=pattern) 零宽正向预测先行断言。断言此位置的后面匹配 pattern ,不捕获结果(零宽)。

 

先行断言 (?=pattern) 不会消耗字符,也就是说,下一次匹配是从上一次匹配之后的位置开始的,而不是在pattern 之后。

var reg = /Windows (?=2008|7)/g ;  // 匹配 "Windows" ,后面必须死 "2008" 或 "7"
var str = "最低配置 Windows 2008 ,推荐 Windows 7 。" ;
alert( reg.exec( str )  ) ; // [ "Windows" ]
alert( reg.lastIndex ) ; // 13 , 第 1 个 "Windows" 后面的位置
alert( reg.exec( str )  ) ; // [ "Windows" ]
alert( reg.lastIndex ) ; // 30 , 第 2 个 "Windows" 后面的位置
(?!pattern)
(?!pattern) 零宽负向预测先行断言,断言此位置的后面不匹配 pattern ,不捕获结果(零宽)。

 

先行断言 (?!pattern) 不会消耗字符,同上。

var reg = /Windows (?!2000|xp)/g ; // 匹配 "Windows" ,后面不能是 "2000" 或 "xp"
var str = "最低配置 Windows 2008 ,推荐 Windows 7 。" ;
alert( reg.exec( str )  ) ; // [ "Windows" ]
alert( reg.lastIndex ) ; // 13 , 第 1 个 "Windows" 后面的位置
alert( reg.exec( str )  ) ; // [ "Windows" ]
alert( reg.lastIndex ) ; // 30 , 第 2 个 "Windows" 后面的位置
x|y
x|y 匹配 x 或 匹配 y

 

比如 see|saw 匹配 "see",也可以匹配 "saw"

var reg = /hello|hi/i ; // 匹配问候语 hello , hi , 忽略大小写 
reg.test( "Hello" ) ; // true
reg.test( "Hi, are you ok !") ; // true
[xyz]
[xyz] 代表一个字符集(字符集中的元字符不需要转义)。匹配任何出现在中括号 [ ] 中的字母 。

 

比如 [abc] 匹配 "plain" 中的 “a”。

可以使用 - 表示字符的范围:

  • 英文字母: [a-zA-Z]
  • 阿拉伯数字: [0-9]
  • 罗马数字: [Ⅰ-Ⅻ]
  • 希腊字母、拼音字母…… ;
  • Unicode 字符编码:[udddd-udddd],其中 d 代表一个 16 进制的数字;
  • Latin-1 字符编码:[xdd-xdd],其中 d 代表一个 16 进制的数字;
var reg = /[a-zA-Z-_]+/g ; // 匹配英文单词
"I wanna be a scientist .".match( reg ) ; // ["I", "wanna", "be", "a", "scientist"]
[^xyz]
[^xyz] 代表一个排除字符集,不匹配任何出现在中括号 [ ] 中的字母 。

 

比如 [^abc] 匹配 "see" 中的 “s”。

var reg = /[<][^>].*?[>]/g ; // 匹配带尖括号的内容
"<div></div>".match( reg ) ; // [ "<div>" , "</div>" ]
\b
\b 匹配单词边界。

 

比如 er\b 匹配 "her" 中的 “er”,但不匹配 “verb” 中的 “er” 。

\b通常用于查找位于单词的开头或结尾的匹配。

var reg = /\b[a-zA-Z-_]+(es|s)\b/g ; // 匹配以 "es" 或 "s" 结尾的单词
"I bought 1 cup, 5 apples, and 6 dozens of eggs".match( reg ) ; // [ "apples" , "dozens" , "eggs" ]
\B
\B 匹配非单词边界的位置。

 

  • 匹配位置的上一个和下一个字符的类型是相同的:即必须同时是单词字符,或必须同时是非单词字符;
  • 字符串的开头和结尾处被视为非单词字符。

比如 er\B 不匹配 "her" 中的 “er”,匹配 “verb” 中的 “er” 。

\B通常用于排除位于单词的开头或结尾的匹配。

var reg = /[a-z-_]*\Boo\B[a-z-_]*/ig ; //匹配内部出现 "oo" 的单词。
"I like reading book in the room too !".match( reg ) ; // [ "book" , "room" ]
\cx
\cx 匹配由 x 字符表示的控制字符。

 

\cM 表示 Ctl+M 或回车字符 "\r"\cJ 表示换行符 "\n"

/td>

\d
\d 匹配一个数字,相当于 [0-9]
var reg = /\d\d/g ; // 匹配两个连续的数字
"[55,25,2422,579]".match( reg ) ; // ["55", "25", "24", "22", "57"]
\D
\D 匹配一个非数字的字符,相当于 [^0-9]
\f
\f 匹配一个换页符,相当于 \x0c\cL
\n
\n 匹配一个换行符,相当于 \x0a\cJ
\r
\r 匹配一个回车符,相当于 \x0d\cM
\s
\s 匹配空白字符,包括空格 " "、制表符 "\t"、翻页符 "\f"、换行符 "\n"、垂直制表符 "\t"

 

相当于 [\f\n\r\t\v]

\S
\S 匹配非空白字符,相当于 [\f\n\r\t\v]
\t
\t 匹配制表符,相当于 \x09\cI
\v
\v 匹配垂直制表符,相当于 \x0b \cK
\w
\w 匹配任何单词字符,包括下划线,相当于 [A-Za-z0-9_]
\W
\w 匹配任何非单词字符,相当于 [^A-Za-z0-9_]
\xn
\xn 匹配 Latin-1 字符,其中的 n16 位的数字。 。

 

所有的 ASCII 字符都可以用 \xn 来表示,如 \x41 匹配 “A” 。

\num
\num 引用前面第 num捕获子表达式 捕获到的字符串。num 是一个正整数。

 

如 (.)\1 同一个字符匹配两次。

var reg = /(.)\2/g ;
"book、see".match( reg ) ; // ["oo", "ee"]
\n
\n n 代表一个数字。

 

  • 如果 \n 前面有至少 n捕获子表达式 ,那么它就作为 “后向引用”,等同于上面的 \num
  • 如果不满足上面的条件,n 又是一个八进制(0-7),那么它作为八进制转义码。
/\2/.test("") ; // true
\nm
\nm nm 代表一个数字。

 

  • 如果 \nm 前面是一个捕获字表达式:
    • 如果 \nm 至少有 nm 个捕获字表达式,则将 \nm 视作后向引用;
    • 如果 \nm 至少有 n 个捕获字表达式,则将 \n 视作后向引用,m 作为一个普通数字;
  • 如果不满足上面的条件,nm 又是八进制(0-7),那么 \nm 作为八进制转义码。
\nml
\nmlnm 当 n 在 0 - 3 间,ml0 - 7 间, 匹配八进制转义码 nml
\un
\un 匹配编码为 n 的 Unicode 字符 。
/\u00A9/.test("©") ; // true

转载于:https://www.cnblogs.com/kangzhibao/p/4085140.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark-sql建表语句限制_第三篇|Spark SQL编程指南

在《第二篇|Spark Core编程指南》一文中&#xff0c;对Spark的核心模块进行了讲解。本文将讨论Spark的另外一个重要模块--Spark SQL&#xff0c;Spark SQL是在Shark的基础之上构建的&#xff0c;于2014年5月发布。从名称上可以看出&#xff0c;该模块是Spark提供的关系型操作AP…

4固定在底部_礼堂椅厂家教你如何固定座椅

礼堂椅厂家众所周知&#xff0c;当人们离开时&#xff0c;礼堂或刷房中使用的座椅会自动翻转到垂直位置&#xff0c;因此行和行之间有一条大通道让人走路。 在现有技术中&#xff0c;通过以下方法翻转礼堂椅&#xff1a;在两个支腿之间设置固定轴&#xff0c;并且在支座底部的两…

带有Hibernate OGM的NoSQL –第三部分:在WildFly上构建REST应用程序

欢迎回到我们的教程系列“带有Hibernate OGM的NoSQL”&#xff01; 感谢Gunnar Morling&#xff08; gunnarmorling &#xff09;创建了本教程。 在这一部分中&#xff0c;您将学习如何在WildFly服务器上运行的Java EE应用程序中使用Hibernate OGM。 使用本教程前面部分已经知道…

关于创业公司的一些事情

最近终于离职了&#xff0c;离开了这家呆了快两年的公司&#xff0c;其中酸甜苦辣&#xff0c;不足为外人道&#xff0c;仅此记录下一些想法&#xff0c;供自己与大家思考。本文只讨论加入创业公司&#xff0c;并不讨论自己创业或者成为合伙人。 0. 该不该加入创业公司 我刚从研…

python时间去掉t_Python的set集合详解

Python 还包含了一个数据类型 —— set &#xff08;集合&#xff09;。 集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。 集合对象还支持 union&#xff08;联合&#xff09;&#xff0c;intersection&#xff08;交&#xff09;&#xff0c;difference&…

快乐学习 Ionic Framework+PhoneGap 手册1-3 {面板切换}

编程的快乐和乐趣&#xff0c;来自于能成功运行程序并运用到项目中,会在后面案例&#xff0c;实际运用到项目当中与数据更新一起说明 从面板切换开始&#xff0c;请看效果图和代码&#xff0c;这只是一个面板切换的效果 Index HTML Code <!DOCTYPE html> <html ng-ap…

去掉左边0_SLAM从0到1——11. 视觉里程计VO内容框架

「本文是之前学习VO 部分整理的思维导图&#xff0c;笔记写入之后均折叠了起来&#xff0c;正文中采用markdown格式展开&#xff0c;可看到笔记内容」放上来的目的其实是方便自己查阅笔记&#xff0c;同样给有需要的同学提供一点思路。整体上的结构分为5部分&#xff0c;包括常…

教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

将Google和GitHub OAuth登录添加到Java应用程序的指南 我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰&#xff0c;那么我想您也希望跳过填写表单和输入新密码的操作 。 只要有权限&#xff0c;许多人都希望使用第三方登录&#xff0c;只要他们要求的权…

工作生活随笔

11月10日&#xff1a;最近在看设计模式&#xff0c;争取把23种设计模式都用php写个示例。但是网上php实现的还是比较少&#xff0c;而且就算有例子也不太满意&#xff0c;倒是其他语言写的还不错。于是最近看了很多其他的语言编写的程序&#xff0c;其实都差不多。以后如果有时…

柔性太阳能电池pdf_房车旅行如何做到电力无忧,那就选择一套合适的太阳能供电系统吧...

“旅行途中房车电力够不够用&#xff1f;”是众多车友在购买房车时会考虑的因素之一。而房车外部供电方式一般有三种&#xff1a;电网供电、发电机发电和太阳能发电&#xff0c;其中太阳能发电因其结构简单、体积小且轻、易安装、维护简单、寿命长不易损坏、一次性投资、循环利…

POJ 3617

题意&#xff1a;给定长度为N的字符串S&#xff0c;现要构造一个字符串T&#xff08;起初为空串&#xff09;。任意进行一下的一种操作&#xff1a; 1>从S的头部删除一个字符&#xff0c;加到T的尾部 2>从S的尾部删除一个字符&#xff0c;加到T的尾部 目的使T的字典序最小…

echarts的词云图表类型有哪些_数据可视化之常见12种图表类型分析

数据可视化有众多展现方式&#xff0c;不同的数据类型要选择适合的展现方法&#xff0c;今天友创云天就整理分析了几种常见的类型&#xff0c;给大家提供参考。1.饼图饼图是一个划分为几个扇形的圆形统计图表。每个扇形的弧长&#xff08;以及圆心角和面积&#xff09;大小&…

使用Spring Boot和注释支持配置Spring JMS应用程序

1.简介 在以前的文章中&#xff0c;我们学习了如何使用Spring JMS配置项目。 如果查看有关使用Spring JMS进行消息传递的文章介绍 &#xff0c;您会注意到它是使用XML配置的。 本文将利用Spring 4.1版本中引入的改进 &#xff0c;并仅使用Java config来配置JMS项目。 在这个示…

两个饥肠咕咕的人

http://www.amznz.com/43/ Long long ago&#xff0c;有两个饥肠咕咕的人得到了一位长者的恩赐&#xff1a;一根鱼竿和一篓鲜活硕大的鱼。其中&#xff0c;一个人要了一篓鱼&#xff0c;另一个人要了一根鱼竿&#xff0c;于是他们分道扬镳了。得到鱼的人原地就用干柴搭起篝火煮…

室内主题元素分析图_2020届室内设计专业优秀毕业设计作品展(五)

“环”食疗养生空间概念设计△建筑外立面▲LOGO前 言每当人们提及健康时&#xff0c;人们的反应往往是运动、睡眠和饮食。现代的青年上班族&#xff0c;又因为快节奏的生活&#xff0c;工作压力大&#xff0c;饮食的不规律&#xff0c;生活不良习性的增加&#xff0c;导致了各…

编写下载服务器。 第一部分:始终流式传输,永远不要完全保留在内存中

下载各种文件&#xff08;文本或二进制文件&#xff09;是每个企业应用程序的生死攸关的事情。 PDF文档&#xff0c;附件&#xff0c;媒体&#xff0c;可执行文件&#xff0c;CSV&#xff0c;超大文件等。几乎每个应用程序迟早都必须提供某种形式的下载。 下载是通过HTTP来实现…

C++输入cin详解

C输入cin详解 输入原理&#xff1a; 程序的输入都建有一个缓冲区&#xff0c;即输入缓冲区。一次输入过程是这样的&#xff0c;当一次键盘输入结束时会将输入的数据存入输入缓冲区&#xff0c;而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的&#xf…

时间序列的截尾和拖尾_R语言:时间序列(一)

01 解决什么问题在社会活动中经常可见按照时间顺序记录下来的随机事件观察值&#xff0c;例如每年死亡人数序列&#xff0c;每年糖尿病发病人数序列&#xff0c;医院门诊每日诊治病例数序列。这类数据的特性是相邻时间点的观察值之间具有明显的相关性&#xff0c;这一特性不同于…

ulimit小结

1. limits是一个进程的资源&#xff0c;会被子进程继承2. soft limit -S, hard limits -Hhard limits只能被root用户修改&#xff0c;启动的时候会加载配置/etc/security/limits.confsoft limits可以被任何用户修改&#xff0c;但不能超过hard limits3. 在linux下&#xff0c;每…

JVM崩溃时:如何调查最严重错误的根本原因

当应用程序崩溃时&#xff0c;您可以学到什么&#xff1f; 我认为&#xff0c;“后见之明是20 /”是最喜欢的短语之一托马斯罗梅尔 &#xff0c;工程ZeroTurnaround的副总裁。 好吧&#xff0c;我实际上不确定在他的短语中占什么位置&#xff0c;但是我已经听过他几次说了。 鉴…