javascript正则表达式

JavaScript 正则表达式

学习笔记

标签(空格分隔): 基础 JavaScript

RegExpexectestStringmatchreplacesearchsplit



一、创建一个正则表达式

两种方法构建正则表达式:

  1. 使用一个正则表达式字面来那个,其由包含在斜杠之间的模式组成。在加载脚本后,正则表达式字面值提供正则表达式的编译。当正则表达式保持不变时,使用此方法可获得更好的性能。
const regex = /ab+c/;
const regex2 = /^[a-zA-Z]+[0-9]*\W?\(/gi;<br/> </code></pre> <pre><code>RegExp</code></pre> <pre><code>let regex_3 = new RegExp(&#39;ab+c&#39;);<br/> let regex_4 = new RegExp(/^[a-zA-Z]+[0-9]*\W?_\)/, ‘gi’);
let regex5 = new RegExp(‘^[a-zA-Z]+[0-9]*\W?\(&#39;, &#39;gi&#39;);<br/> </code></pre> <h3>二、编写一个正则表达式的模式</h3> <pre><code>/ab//ab*c//Chapter (\d+)\.\d*/</code></pre> <h4>1. 使用简单的模式</h4> <pre><code>/abc/</code></pre> <h4>2. 使用特殊字符</h4> <p>当你需要搜索一个比直接匹配需要更多条件的匹配时,比如寻找一个或多个&#39;b&#39;后面跟了零个或者多个&#39;b&#39;(*的意思就是前面一项出现了零个或者多个),而且后面跟着&#39;c&#39;的任何字符串&#39;cbbabbbbcdebc&#39;中,这个模式匹配了子字符串&#39;abbbbc&#39;。</p> <p><strong>正则表达式中的特殊字符</strong></p> <pre><code>\&#39;b&#39;\/a*//a\*/new RegExp(&#39;pattern&#39;)^/^A/\)/t\(/*/bo*/+/a+/?/e?le?//\d+//\d+?/x(?=y)x(?!y)./.n/(x)/(foo) (bar) \1 \2/\1\2\1\2\n\)1\(2\)n’bar foo‘.replace(/(…) (…)/, ’\(2 \)1‘)(?:x)/(?:foo){1,2}//foo{1,2}/x(?=y)/Jack(?=Sprat)//Jack(?=Sprat|Frost)/x(?!y)/\d+(?!.)//\d+(?!.)/.exec(’3.141‘)x|y{n}/a{2}/{n,m}/a{1,3}/[xyz]-.[abcd][a-d]/[a-z.]+//[\w.]+/[^xyz]-[^abc][^a-c][\b]\b/\bm//oo\b//oon\b//\w\b\w/\B/\B..//y\B/\cX/\cM/\d[0-9]/\d//[0-9]/\D[^0-9]/\D//[^0-9]/\f\n\r\s[\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/\s\w/\S[^\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/\S\w*/\t\v\w[A-Za-z0-9]/\w/\W[^A-Za-z0-9]/\W/\n/apple(,)\sorange\1/\0\0\xhh\uhhhh\u{hhhh}
function escapeRegExp(string) {

return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, &#39;\\$&amp;&#39;/);<br/>
// $&amp;表示整个被匹配的字符串<br/>

}

3. 使用插入语

任何正则表达式的插入语都会使这部分匹配的副字符串被记忆。一旦被记忆,这个副字符串就可以被调用于其它用途,如同使用括号的子字符串匹配中所述。

/Chapter (\d+).\d/\d+\d

此模式可以匹配字符串’Open Chapter 4.3, paragraph 6‘,并且’4‘将会被记住。此模式并不能匹配’Chapter 3 and 4‘,因为在这个字符串中’3‘后面没有点’.‘。

let str_17 = ’Open Chapter 4.3, paragraph 6‘;
console.log(/Chapter (\d+).\d/.exec(str_17)); // [“Chapter 4.3”, “4”, index: 5, input: “Open Chapter 4.3, paragraph 6”]
(?:\d+)

三、使用正则表达式

RegExpexectestStringmatchreplacesearchsplit

使用正则表达式的方法

exectestmatchsearchreplacesplit

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

例如使用exec方法在一个字符串中查找一个匹配。

const myRe = /d(b+)d/g;
let str_18 = ’cdbbdbsbz‘;
let myArray = myRe.exec(str_18);
console.log(myArray); // [“dbbd”, “bb”, index: 1, input: “cdbbdbsbz”]

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

let myArray_2 = /d(b+)d/g.exec(str_18);
console.log(myArray); // [“dbbd”, “bb”, index: 1, input: “cdbbdbsbz”]

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

const myRe_2 = new RegExp(’d(b+)d‘, ’g‘);
let myArray_3 = myRe_2.exec(str_18);
console.log(myArray_3);
// [“dbbd”, “bb”, index: 1, input: “cdbbdbsbz”]
// 0: “dbbd”
// 1: “bb”
// index: 1
// input: “cdbbdbsbz”
// length: 2
// proto: Array(0)

通过这些脚本,匹配成功后将返回一个数组并且更新正则表达式的属性。

正则表达式执行返回信息

myArray[“dbbd”, “bb”]index1input“cdbbdbsbz”[0]“dbbd”myRelastIndex5sourced(b+)d

在这个例子中如第二种形式所示,你可以使用一个正则表达式创建一个没有分配给变量的对象初始化容器。如果你这样做,每一次使用时都好比在使用一个新的正则表达式。所以如果使用这个未分配给变量的正则,将在随后不能访问这个正则表达式的属性:

let myArray_4 = /d(b+)d/g.exec(str_18);
console.log(’The value of lastIndex is ‘ + /d(b+)d/g.lastIndex); // The value of lastIndex is 0

1. 使用括号的子字符串匹配

/a(b)c/

使用括号匹配的子字符串的数量数无限的。返回的数组中保存所有被发现的子匹配。下面的例子说明了如何使用括号的子字符串匹配。

下面的脚本使用replace()方法来转换字符串中的单词,在匹配到的替换文本中,脚本使用替代的\(1,\)2表示第一个和第二个括号的子字符串匹配。

const re_11 = /(\w+)\s(\w+)/;
let str_19 = ’Jehorn Gu‘;
let str_19_r = str_19.replace(re_11, ’\(2, \)1‘);
console.log(str_19_r); // Gu, Jehorn

2. 通过标志进行高级搜索

正则表达式有四个可选参数进行全局和部分大小写搜索。这些参数既可以单独使用也可以一起使用在任何顺序和包含正则表达式的部分中。

gimy

包含一个标志的正则表达式,使用这个表达式:

var re = /pattern/flags;

或者

var re = new RegExp(“pattern”, “flags”);

值得注意的是,标志时一个正则表达式的一部分,它们在接下来的时间将不能添加或删除。

re = /\w+\s/g
const re_12 = /\w+\s/g;
let str_20 = ’fee fi fo fum‘;
let myArray_5 = str_20.match(re_12);
console.log(myArray_5); // [“fee ”, “fi ”, “fo ”]

m标志用于指定多行输入字符串应该被视为多个行。如果使用m标志,^和$匹配的开始或结束输入字符串中的每一行,而不是整个字符串的开始或结束。

四、例子

1. 改变输入字符串的顺序

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

// 姓名字符串包含多个空格和制表符
// 而且可能在姓氏和名字之间有多个空格
let names = ’Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ; Chris Hand ‘; let output = [’———- Original String\n‘, names + ’\n‘]; // 准备两个正则表达式和数组模型
// 将字符串分隔到数组元素中 // 正则: 可能空格 分号 空格
let pattern = /\s
;\s*/; // 将字符串拆分成上面模式分隔的部分
// 将这些片段存储在名为nameList的数组中
let nameList = names.split(pattern); // 新的正则: 一个或多个字符 空格 字符
// 使用圆括号来“记住”匹配的部分
// 记住的部分将在后面使用
pattern = /(\w+)\s+(\w)/; // 用于存放被处理后名字的数组
let bySurnameList = []; // 显示名称数组并将用逗号分隔的名字填充到新的数组
// 替换方法删除了所有匹配到的,并且替换为记住的字符串的第一部分
// 随后是逗号,最后是记住字符串的第二部分
output.push(’———- After Split by Regular Expression‘); let i, len;
for (i = 0, len = nameList.length; i &lt; len; i++) {

output.push(nameList[i]);<br/>
bySurnameList[i] = nameList[i].replace(pattern, &#39;$2, $1&#39;);<br/>

} // 显示新数组
output.push(’———- Names Reversed‘);
for (i = 0, len = bySurnameList.length; i &lt; len; i++) {

output.push(bySurnameList[i]);<br/>

} // 根据姓氏排序 然后显示排好序的数组
bySurnameList.sort();
output.push(’———- Sorted‘);
for (i = 0, len = bySurnameList.length; i &lt; len; i++) {

output.push(bySurnameList[i]);<br/>

} output.push(’———- End‘); console.log(output.join(’\n‘));
// join() 方法用于把数组中的所有元素放入一个字符串。
// 元素是通过指定的分隔符进行分隔的。
// arrayObject.join(separator);

控制台打印效果为:

2. 用特殊字符检验输入

在以下例子中,我们期望用户输入一个电话号码。当用户点击’Submit‘按钮,我们的脚本开始检查这些数字是否合法。如果数字合法(匹配正则表达式所规定的字符序列),脚本显示一条感谢用户的信息并确认该数字。如果这串数字不合法,脚本提示用户电话号码不合法。

(?:\d{3}|(\d{3}))([-\/.])\d{3}\1

当用户按下Enter设置RegExp.input,这些变化也能被激活。

&lt;p&gt;

Enter your phone number (with area code) and then click &#39;SUBMIT&#39;. &lt;br&gt;<br/>
The expected format is like ###-###-####.<br/>

&lt;/p&gt;
&lt;form action=“javascript: void(0);”&gt;

&lt;input type=&#34;text&#34; id=&#34;phone&#34;&gt;<br/>
&lt;button type=&#34;submit&#34; onclick=&#34;testInfo(document.getElementById(&#39;phone&#39;));&#34;&gt;SUBMIT&lt;/button&gt;<br/>

&lt;/form&gt; &lt;script type=“text/javascript”&gt;

const re_phone = /(?:\d{3}|\(\d{3}\))([-\/\.])\d{3}\1\d{4}/;<br/>
function testInfo(phoneInput) {<br/>
    let OK = re_phone.exec(phoneInput.value),<br/>
        OK_str;

console.log(OK);

    OK_str = phoneInput.value + &#39; isn\&#39;t a phone number with area code!&#39;;<br/>
    if (OK) OK_str = &#39;Thanks, ur phone number is &#39; + OK[0];

window.alert(OK_str);

}<br/>

&lt;/script&gt;

The end…    Last updated by: Jehorn, Jan 01, 2018, 4:16 PM

附录 常用总结

/^[\s\S]*$/