• String是对 string的对象的封装
    1. var s = new String("foo"); // Creates a String object
    2. console.log(s); // Displays: { '0': 'f', '1': 'o', '2': 'o'}
    3. typeof s; // Returns 'object'
    4. //可以在 String字面值上使用String对象的方法,JS把字面值转换成一个临时对象,然后调用属性,最后再丢弃它。
    5. //在 String字面值上也可以使用 String.length属性。

    //可以在 String字面值上使用String对象的方法,JS把字面值转换成一个临时对象,然后调用属性,最后再丢弃它。
    //在 String字面值上也可以使用 String.length属性。

    除非必要,尽量使用 String字面值,因为 String对象的某些方法与直观感觉不一致。

    1. var s1 = "2 + 2"; // Creates a string literal value
    2. var s2 = new String("2 + 2"); // Creates a String object
    3. eval(s1); // Returns the number 4
    4. eval(s2); // Returns the string "2 + 2"
    • 多行模版字符串。模版字符串使用反勾号 ( ) ,而不是单引号/双引号。

    使用一般的字符串时, 为了创建多行的字符串不得不用如下语法:

    1. console.log("string text line 1\n\
    2. string text line 2");
    3. // "string text line 1
    4. // string text line 2"

    为了实现同样效果的多行字符串, 现在可以写成如下形式:

    1. console.log(`string text line 1
    2. string text line 2`);
    3. // "string text line 1
    4. // string text line 2"
    • 正则表达式。注意: JavaScript的正则表达式引擎将特定的字符集定义为“字”字符。不在该集合中的任何字符都被认为是一个断词。这组字符相当有限:它只包括大写和小写的罗马字母,十进制数字和下划线字符。不幸的是,重要的字符,例如“é”或“ü”,被视为断词。
      | [exec](https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/RegExp/exec) | 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回null)。 | | :—- | :—- | | [test](https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/RegExp/test) | 一个在字符串中测试是否匹配的RegExp方法,它返回true或false。 | | [match](https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/String/match) | 一个在字符串中执行查找匹配的String方法,它返回一个数组或者在未匹配到时返回null。 | | [search](https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/String/search) | 一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。 | | [replace](https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/String/replace) | 一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。 | | [split](https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/String/split) | 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的String方法。 |

    当你想要知道在一个字符串中的一个匹配是否被找到,你可以使用test或search方法;想得到更多的信息(但是比较慢)则可以使用exec或match方法。如果你使用exec或match方法并且匹配成功了,那么这些方法将返回一个数组并且更新相关的正则表达式对象的属性和预定义的正则表达式对象(详见下)。如果匹配失败,那么exec方法返回null(也就是false)。

    在接下来的例子中,脚本将使用exec方法在一个字符串中查找一个匹配。

    1. var myRe = /d(b+)d/g;
    2. var myArray = myRe.exec("cdbbdbsbz");

    如果你不需要访问正则表达式的属性,这个脚本通过另一个方法来创建myArray:

    1. var myArray = /d(b+)d/g.exec("cdbbdbsbz");

    如果你想通过一个字符串构建正则表达式,那么这个脚本还有另一种方法:

    1. var myRe = new RegExp("d(b+)d", "g");
    2. var myArray = myRe.exec("cdbbdbsbz");

    通过这些脚本,匹配成功后将返回一个数组并且更新正则表达式的属性,如下表所示
    表 4.3 正则表达式执行返回信息

    对象 属性或索引 描述 在例子中对应的值
    myArray 匹配到的字符串和所有被记住的子字符串。 ["dbbd", "bb"]
    index 在输入的字符串中匹配到的以0开始的索引值。 1
    input 初始字符串。 "cdbbdbsbz"
    [0] 匹配到的所有字符串(并不是匹配后记住的字符串)。注:原文”The last matched characters.”,应该是原版错误。匹配到的最终字符。 "dbbd"
    myRe lastIndex 下一个匹配的索引值。(这个属性只有在使用g参数时可用在 通过参数进行高级搜索 一节有详细的描述.) 5
    source 模式文本。在正则表达式创建时更新,不执行。 "d(b+)d"

    正则表达式标志

    标志 描述
    g 全局搜索。
    i 不区分大小写搜索。
    m 多行搜索。
    y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。

    这段代码将输出 [“fee “, “fi “, “fo “]。在这个例子中,你可以将:

    1. var re = /\w+\s/g;

    替换成:

    1. var re = new RegExp("\\w+\\s", "g");

    并且能获取到相同的结果。
    M标志被指定多行字符串应被视为多个行。如果使用的话,^和$匹配的开始或者结束输入的每一行,而不是字符串来结束
    用特殊字符检验输入节
    在以下例子中,我们期望用户输入一个电话号码。当用户点击“Check”按钮,我们的脚本开始检查这些数字是否合法。如果数字合法(匹配正则表达式所规定的字符序列),脚本显示一条感谢用户的信息并确认该数字。如果这串数字不合法,脚本提示用户电话号码不合法。.
    包含非捕获括号 (?: 这个正则表达式寻找三个数字字符\d{3} 或者 | 一个左半括号\(跟着三位数字\d{3}, 跟着一个封闭括号 \), (结束非捕获括号 )), 后跟着一个短破折号或左斜杠或小数点,随后跟随三个数字字符,当记忆字符 ([-\/\.])捕获并记住,后面跟着三位小数 \d{3},再后面跟随记住的左斜杠、右斜杠或小数点 \1,最后跟着四位小数 \d{4}。
    当用户按下Enter设置RegExp.input,这些变化也能被激活。

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    5. <meta http-equiv="Content-Script-Type" content="text/javascript">
    6. <script type="text/javascript">
    7. var re = /(?:\d{3}|\(\d{3}\))([-\/\.])\d{3}\1\d{4}/;
    8. function testInfo(phoneInput) {
    9. var OK = re.exec(phoneInput.value);
    10. if (!OK)
    11. window.alert(phoneInput.value + ' isn\'t a phone number with area code!');
    12. else
    13. window.alert('Thanks, your phone number is ' + OK[0]);
    14. }
    15. </script>
    16. </head>
    17. <body>
    18. <p>Enter your phone number (with area code) and then click "Check".
    19. <br>The expected format is like ###-###-####.</p>
    20. <form action="#">
    21. <input id="phone"><button onclick="testInfo(document.getElementById('phone'));">Check</button>
    22. </form>
    23. </body>
    24. </html>

    改变输入字符串的顺序节
    以下例子解释了正则表达式的构成和string.split() 以及 string.replace()的用途。它会整理一个只有粗略格式的含有全名(名字首先出现)的输入字符串,这个字符串被空格、换行符和一个分号分隔。最终,它会颠倒名字顺序(姓氏首先出现)和list的类型。

    1. // 下面这个姓名字符串包含了多个空格和制表符,
    2. // 且在姓和名之间可能有多个空格和制表符。
    3. var names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ; Chris Hand ";
    4. var output = ["---------- Original String\n", names + "\n"];
    5. // 准备两个模式的正则表达式放进数组里。
    6. // 分割该字符串放进数组里。
    7. // 匹配模式:匹配一个分号及紧接其前后所有可能出现的连续的不可见符号。
    8. var pattern = /\s*;\s*/;
    9. // 把通过上述匹配模式分割的字符串放进一个叫做nameList的数组里面。
    10. var nameList = names.split(pattern);
    11. // 新建一个匹配模式:匹配一个或多个连续的不可见字符及其前后紧接着由
    12. // 一个或多个连续的基本拉丁字母表中的字母、数字和下划线组成的字符串
    13. // 用一对圆括号来捕获该模式中的一部分匹配结果。
    14. // 捕获的结果稍后会用到。
    15. pattern = /(\w+)\s+(\w+)/;
    16. // 新建一个数组 bySurnameList 用来临时存放正在处理的名字。
    17. var bySurnameList = [];
    18. // 输出 nameList 的元素并且把 nameList 里的名字
    19. // 用逗号接空格的模式把姓和名分割开来然后存放进数组 bySurnameList 中。
    20. //
    21. // 下面的这个替换方法把 nameList 里的元素用 $2, $1 的模式
    22. // (第二个捕获的匹配结果紧接着一个逗号一个空格然后紧接着第一个捕获的匹配结果)替换了
    23. // 变量 $1 和变量 $2 是上面所捕获的匹配结果。
    24. output.push("---------- After Split by Regular Expression");
    25. var i, len;
    26. for (i = 0, len = nameList.length; i < len; i++){
    27. output.push(nameList[i]);
    28. bySurnameList[i] = nameList[i].replace(pattern, "$2, $1");
    29. }
    30. // 输出新的数组
    31. output.push("---------- Names Reversed");
    32. for (i = 0, len = bySurnameList.length; i < len; i++){
    33. output.push(bySurnameList[i]);
    34. }
    35. // 根据姓来排序,然后输出排序后的数组。
    36. bySurnameList.sort();
    37. output.push("---------- Sorted");
    38. for (i = 0, len = bySurnameList.length; i < len; i++){
    39. output.push(bySurnameList[i]);
    40. }
    41. output.push("---------- End");
    42. console.log(output.join("\n"));