js에서 정규식은 RegExp 개체로 표현됩니다. RegExp는 정규식의 약어입니다. RegExp 단순 패턴은 단일 문자일 수 있습니다. 더 복잡한 패턴에는 더 많은 문자가 포함되며 구문 분석, 형식 확인, 대체 등에 사용될 수 있습니다. RegExp() 생성자를 사용하여 RegExp 개체를 만들거나 리터럴 구문을 사용할 수 있습니다.
1. RegExp 소개.
RegExp는 단일 문자열을 사용하여 특정 구문 규칙을 준수하는 일련의 문자열 검색 패턴을 설명하고 일치시키는 정규식(정규식, 코드에서 regex, regexp 또는 RE/re/reg로 종종 축약됨)입니다. . 검색 모드에서는 텍스트 검색 및 텍스트 교체가 가능합니다.
정규식은 일련의 문자로 구성된 검색 패턴입니다. 텍스트에서 데이터를 검색할 때 검색 패턴을 사용하여 쿼리하려는 내용을 설명할 수 있습니다. 문자열 패턴을 일치시키고 검색하고 바꾸는 데 사용할 수 있는 문자 패턴을 설명하는 문자열에 대한 패턴 일치를 수행하는 강력한 도구입니다.
소위 정규식은 규칙이나 패턴 표현으로 직접적으로 이해될 수도 있는데, 이는 컴퓨터가 이해할 수 있는 특정 규칙을 표현하는 것이지만, 일반 사람들이 이해하기 어려운 텍스트 표현으로 사용될 수 있습니다. 모든 텍스트 검색 및 텍스트 대체 작업은 간단히 말해서 문자열을 처리하는 것입니다.
2. 문자열 방식.
(1), charAt() 특정 문자를 가져와 문자열에서 특정 문자를 반환합니다.
(2), Split() 문자열을 분할하여 배열을 얻습니다.
(3), search()특정 문자가 처음 나타나는 위치를 찾는다. 정규식과 함께 사용하는 것이 좋다. 찾지 못하면 -1이 반환된다.
(4), match()문자열에서 지정된 문자를 찾아서 해당 문자를 반환합니다. 정규식을 사용하지 않으면 지정된 문자가 처음 나타나는 부분만 반환되고 역방향 일치는 수행되지 않습니다. 정규식을 사용하고 전역 일치를 수행하는 경우 문자열에 지정된 모든 문자를 배열 형식으로 반환하거나, 찾을 수 없는 경우 null을 반환합니다.
(5), replacement() 문자를 바꾸고 새 문자열을 반환합니다. 정규식과 함께 사용하는 것이 더 좋으며 모든 일치 항목을 바꿀 수 있습니다.
<script> var str='abcdefgca'; //返回字符串中某一位的字符。 alert(str.charAt()); //返回:d //查找字符串首次出现的位置。 alert(str.search('z')); //返回:- //查找指定的字符。 //只返回第一次出现的c,不再向后匹配。 alert(str.match('c')); //返回:c //将'a'替换为'i'。 //只替换了第一个位置的a,不再向后匹配。 alert(str.replace('a', 'i')); //返回:ibcdefgca //分割字符串。 var str='--aaa--cd'; var arr=str.split('-'); //返回:,,aaa,,cd alert(arr); </script>
예: 일반적인 방법을 사용하여 문자열에서 모든 숫자 찾기
구현 아이디어: 문자열에서 숫자를 찾는 것은 어렵지 않습니다. 판단을 사용하여 문자열에서 숫자를 먼저 추출한 다음 문자열에 숫자가 두 개 이상 있어야 하므로 이를 저장하려면 빈 문자열이 필요합니다. . 숫자 문자를 추출한 다음 이 숫자 문자를 배열에 추가하고 마지막으로 반환하면 완료됩니다. 프로그램이 어떻게 구현되는지 살펴보겠습니다.
<script> var str=' abc d aa c zz -=-=s-'; var arr=[]; var num=''; //首先循环遍历字符串 for(var i=;i<str.length;i++){ //再判断当前字符大于等于并且小于等于,则为数字 if(str.charAt(i)>='' && str.charAt(i)<=''){ //那么就将当前的字符存储在空字符串中 num += str.charAt(i); } else{ //如果字符串中有值。 if(num){ //将值添加到数组中。 arr.push(num); //再清空字符串,避免重复添加。 num=''; } } } //最后在整个字符串结束之后有可能还会有数字,再做一次判断。 if(num){ //如果还有值就添加到数组中。 arr.push(num); //再清空字符串。 num=''; } //返回:OK,现在返回就完成了。 alert(arr); //返回:,,,,,,, </script>
일반적인 방법으로 완성할 수 있고 구조도 명확하지만, 정규식을 사용하면 코드가 꽤 길어집니다. 그러면 표현식 하나로 너무 많은 작업을 완료할 수 있어 매우 편리합니다. 정규 표현식을 사용하세요.
3. 규칙적인 규칙을 사용하세요.
정규식 구문: var re = new RegExp('pattern', 'modifier');
패턴은 표현식의 패턴이며 수식자는 전역 일치, 대소문자 구분 등을 지정하는 데 사용됩니다. 완전한 형태는 정규 표현식입니다.
이렇게 정규 구문을 보면 JS에서 새로 생성되는 객체의 일반적인 구문이 아닌가요? 그런데 새로운 일반 객체를 생성한다는 뜻이죠. new 키워드를 사용하지 말아야 한다는 것은 모두가 알고 있는 사실입니다. new를 사용하면 의심할 여지 없이 새로운 개체가 생성되며, 이는 또한 일정량의 메모리 공간을 차지한다는 것을 의미합니다. 제대로 처리하지 않으면 과도한 축적으로 인해 메모리 오버플로가 발생합니다. 이는 코드 최적화 구현에 도움이 되지 않는 리소스입니다. 동시에 이러한 작성 방식은 규칙성의 힘을 반영하지 않으므로 매우 간결해야 하므로 실제 사용에서는 다음과 같은 다른 스타일을 사용하지 않습니다. 🎜>
구문: var re = /mode/modifier;이 스타일은 비교적 간결하고 일반인들이 이해할 수 없는 표현 방식입니다.
(1), 수식어.
수정자는 전역 일치 및 대소문자 구분을 수행하는 데 사용됩니다.
대소문자 무시: i(ignore의 약어, 중국어 번역:ignore)
글로벌 매칭 : g(global의 약어, 중국어 번역 : all/global)
예: 특정 문자에 대한 전역 검색
<script> var str='AbCdEFgiX'; //JS风格: //这个正则表达式什么也不代表,只代表abc本身。 var reg=new RegExp('abc', 'i'); alert(str.match(reg)); //返回:AbC //常用风格: var re=/efg/i; alert(str.match(re)); //返回:EFg </script>
4. 대괄호와 메타문자.
(1), 대괄호.대괄호는 특정 범위 내의 문자를 찾는 데 사용됩니다.
①、모든 캐릭터
표현: [abc]
대괄호 안의 문자를 찾으세요.
[] 여기서는 또는 즉, 나타나는 것이 무엇이든 가능하다는 것을 의미합니다.
<script> var str='apc xpc ppc bpc spc opc'; //[apx]pc,随便出现哪个都行,即:apc ppc xpc var re=/[apx]pc/g; alert(str.match(re)); //返回前个pc。 </script>
②、范围查找。
表达式:[0-9] [a-z] [A-z] [A-Z]
[0-9] 查找任意 0 - 9 的数字。
[a-z] 查找任意 a - z 的字符。
[A-z] 查找任意 大写A - 小写z 的字符。
[A-Z] 查找任意 大写A - 大写Z的字符。
③、排除查找。
表达式:[^abc] [^a-z] [^0-9]
[^abc] 查找任意不在方括号中的字符。
[^a-z] 查找任意除了字母以外的字符,包括数字符号中文外文。
[^0-9] 查找任意除了数字以外的字符,包括字母符号中文外文。
<script> var str='ot out o.t o t o`t ot ot'; //o和t中间除了数字,什么都可以 var re=/o[^-]t/g; alert(str.match(re)); //返回:out,o.t,o t,o`t </script>
4. 검색을 선택하세요.
표현식: (a|b|c)
a, b, c 중에서 지정된 옵션을 찾으세요.
⑤. 매칭은 다음과 같은 조합 모드를 사용할 수도 있습니다: [a-z0-9A-Z] [^a-z0-9]
[a-z0-9A-Z] 대문자 또는 소문자 및 숫자.
[^a-z0-9] 문자, 숫자 외에는 모두 가능합니다.
(2) 메타문자.
메타 문자는 특별한 의미를 지닌 문자로 이스케이프 문자라고도 합니다.
다음은 일반적으로 사용되는 메타 문자입니다.
메타문자 | 설명 | 사용 |
. | 개행 문자와 줄 종결자를 제외한 모든 문자를 나타내는 단일 문자를 찾습니다. | 문제가 발생하기 쉬우므로 사용을 권장하지 않습니다. |
ㅇ | [a-z0-9]에 해당하는 영어 숫자, 밑줄 등의 단어 문자 찾기 | /w/ |
여 | [^a-z0-9]에 해당하는 비단어 문자 찾기 | /W/ |
디 | [0-9]에 해당하는 숫자 찾기 | /d/ |
ㄷ | [^0-9]에 해당하는 숫자가 아닌 숫자 찾기 | /D/ |
공백, 캐리지 리턴, 탭, 줄 바꿈 및 폼 피드를 포함한 공백 문자를 찾으십시오. 인쇄할 수 없는 문자는 표시할 수 없습니다. | /s/ | |
에 | 공백이 아닌 문자를 찾습니다. | /S/ |
ㄴ | 단어의 시작이나 끝에서 일치하는 항목을 찾거나, 일치하는 항목이 없으면 null을 반환합니다. | /b/ |
ㄴ |
단어 경계가 아닌, 즉 시작이나 끝이 아닌 일치 항목을 찾습니다. 일치하는 위치의 이전 문자와 다음 문자의 유형이 동일합니다. 즉, 둘 다 단어여야 합니다. , 또는 둘 다 단어가 아니어야 합니다. 문자열의 시작과 끝 부분에 있는 은 단어가 아닌 문자로 간주되며, 일치하지 않으면 null이 반환됩니다. |
/B/ |
n | 개행 문자를 찾아 찾은 경우 해당 위치를 반환하고, 찾지 못한 경우 -1을 반환합니다. | /n/ |
에프 | 페이지 나누기를 찾습니다. | /f/ |
r | 캐리지 리턴 문자를 찾으세요. | /r/ |
ㅇ | 탭 문자를 찾아보세요. |
5. 수량자.
소위 수량자는 수량자, 즉 숫자를 의미하며, 발생 횟수를 표현하기 위해 정규식에서 사용됩니다.
다음은 일반적으로 사용되는 수량사입니다.
정량자 | 설명 | 사용 |
* | 0개 또는 임의의 횟수, {0,} | 과 동일권장하지 않습니다. 범위가 너무 넓고 정확하지 않습니다. |
? | 0회 또는 1회({0, 1}과 동일) | /10?/g 바로 뒤에 오는 0 또는 1 '0'을 포함하여 1에 대한 전역 검색을 수행합니다. |
한 번 또는 여러 번, {1, }과 동일 | /w /g 하나 이상의 단어에 대해 전체 검색을 수행합니다. | |
{n} | 정확히 n번 | /d{4}/g는 4자리 숫자에 대한 전역 검색을 수행합니다. |
{n,} | n회 이상, 최대 횟수 제한 없음 | /d{3,}/g 최소 3자리 숫자가 포함된 숫자에 대해 전역 검색을 수행합니다. |
{n,m} | n회 이상, 최대 m회 | /d{3,4}/g 세 자리 또는 네 자리 숫자가 포함된 숫자에 대해 전역 검색을 수행합니다. |
다음은 일반적으로 사용되는 일치 패턴입니다.
모드 | 설명 | 사용 |
^a | a로 시작하는 모든 문자는 줄의 시작을 의미합니다. | /^d/ 숫자로 시작 /^a/g 'a'로 시작하는 문자에 대한 전역 검색 |
a$ | 줄의 끝을 나타내는 a로 끝나는 문자 | /d$/ 숫자로 끝남 /z$/g 'z'로 끝나는 문자에 대한 전역 검색 |
?=a | 문자 뒤에 | 가 오는 문자/a(?= b)/g 'a' 뒤에 'b' 문자가 오는 전역 검색 |
?!아 | 뒤에 문자가 오지 않는 문자 | /c(?= d)/g 'c' 다음에 'd'가 오지 않는 문자에 대한 전역 검색 |
6、字符串和正则配合。
(1)、search()配合正则
实例:找出字符串中第一次出现数字的位置
<script> var str='asdf zxcvbnm'; //元字符d,表示转义为数字 var re=/\d/; alert(str.search(re)); //返回: 第一个数字为出现在第位 </script>
(2)、match()配合正则
其实没有什么东西是非正则不可的,只是正则可以让做东西更方便。下面就完成本章遗留的历史问题,怎么使用正则,能一句代码就完成普通方法需要很多行代码才能完成的东西。
在实例之前,先看看match()与正则的配合。
<script> var str='asdf zxcvm'; //找出字符串中的数字可以使用元字符\d var re=/\d/; //没告诉系统要找多少数字,系统在找到数字后就返回 alert(str.match(re)); //返回: //因此需要全局匹配,使用修饰符g var re=/\d/g; //没告诉系统要找几位,系统会将所有找到的数字返回 alert(str.match(re)); //返回:,,,,,,,,,,,, //所以可以使用两个元字符,告诉系统要找的数字是位 var re=/\d\d/g; //显然这样是不可取的,因为数字的位数并不固定,可能是位,有可能还是多位 alert(str.match(re)); //返回:,,,, //所以需要用到量词+,+代表若干,也就是多少都可以。 var re=/\d+/g; //现在返回正确。 alert(str.match(re)); //返回:,,,, </script>
实例:使用正则找出字符串中所有数字
<script> var str=' abc d aa c zz -=-=s-'; //alert(str.match(/\d+/g)); //元字符d也可以使用[-]代替,到随便哪个都行。 alert(str.match(/[-]+/g)); //返回:,,,,,,, </script>
正则是强大的字符串匹配工具,就这样简单的使用一句代码就完成了。
(3)、replace()配合正则
<script> var str='abc zaaz deaxcaa'; //将字符串中的a替换为数字 alert(str.replace('a', )); //仅仅只将第一个a替换为 //配合正则使用匹配所有a再替换 var re=/a/g; alert(str.replace(re, '')); //返回所有的a都为 </script>
实例:简单的敏感词过滤
所谓的敏感词,就是法律不允许的词语,一切非法词都可以叫做敏感词,这包括的范围就太广了,比如危害国家安全,反对宪法确立的基本原则,散步谣言,扰乱民心,扰乱社会秩序,破坏社会稳定,色情、暴力、赌博、虚假、侵害、骚扰、粗俗、猥亵或其他道德上令人反感的词,以及含有法律规定或禁止的其他内容的词语。在平时最常见也是大多数人都会用的词莫属道德上令人反感的词了,说斯文一点就是吵架时用于攻击别人的词语。这里就列举几个热门的网络词语作为例子。
<!DOCTYPE html> <html> <head> <meta charset="UTF-"> <title>JavaScript实例</title> <script> window.onload=function (){ var oBtn=document.getElementById('btn'); var oTxt=document.getElementById('txt'); var oTxt=document.getElementById('txt'); oBtn.onclick=function (){ //这里的|在正则中表示 或 的意思 var re=/元芳|萌萌哒|然并卵|毛线|二货|城会玩/g; //文本框的值等于文本框的值过滤掉敏感词 oTxt.value=oTxt.value.replace(re,'***'); }; }; </script> </head> <body> <textarea id="txt" rows="" cols=""></textarea><br> <input id="btn" type="button" value="过滤"><br> <textarea id="txt" rows="" cols=""></textarea> </body> </html>
可在第一个文本框中输入一些相关语句,点击过滤按钮,查看过滤后的效果。
此外,支持正则表达式的 String 对象的方法还包括 split() 方法,可把字符串分割为字符串数组。
7、RegExp对象方法。
在JS中,RegExp对象是一个预定义了属性和方法的正则表达式对象。
(1)、test()
test() 方法用于检测一个字符串是否匹配某个模式,也就是检测指定字符串是否含有某个子串,如果字符串中含有匹配的文本,返回 true,否则返回 false。
语法:RegExpObject.test(str)
调用 RegExp 对象 re 的 test() 方法,并为它传递字符串str,与这个表示式是等价的:(re.exec(str) != null)。
实例:搜索字符串是否含有指定的字符
<script> var str='The best things in life are free, like hugs, smiles, friends, kisses, family, love and good memories.'; var re=/i/; alert(re.test(str)); //返回:true var reg=/z/; alert(reg.test(str)); //返回:false //上面的代码可以不用定义正则的变量,直接使用,将两行合并为一行。 alert(/i/.test(str)); alert(/z/.test(str)); </script>
(2)、exec()
exec() 方法用于检索字符串中的正则表达式的匹配,提取指定字符串中符合要求的子串,该方法返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回 null。可以使用循环提取所有或者指定index的数据。
语法:RegExpObject.exec(str)
exec() 方法的功能非常强大,它是一个通用的方法,可以说是test() 方法的升级版,因为他不仅可以检测,而且检测到了可以直接提取结果。该方法使用起来比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。
<script> var str = 'good good study day day up'; var re = /good/; var arr = re.exec(str); console.log(arr); //控制台显示:["good"]点开后显示: "good",index ,input "good good study day day up"。 console.log(arr.index); //控制台显示: console.log(arr.input); //控制台显示:good good study day day up </script>
通过上面的实例,可以看到,如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。
除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。
什么是"与子表达式相匹配的文本"?
所谓的子表达式就是正则表达式中包含在圆括号中的内容。看下面实例:
<script> var str = 'good good study day day up'; var re = /g(o+)d/; var arr = re.exec(str); console.log(arr); //显示:["good", "oo"]点开后显示: "good", "oo", index ,input: "good good study day day up" console.log(arr.length); //显示: var reg = /(o+)/; //var reg = /o+/; 只返回一个"oo",长度为 var arr = reg.exec(str); console.log(arr); //显示:["oo", "oo"]点开后显示: "oo", "oo", index ,input: "good good study day day up" console.log(arr.length); //显示: </script>
通过上例,可以看到,子表达式是一个大的表达式的一部分,并且必须用()包含起来。一个表达式可使用多个子表达式,同时还支持多层嵌套,把一个表达式划分为多个子表达式的目的是为了把那些子表达式当作一个独立的元素来使用。也就是说表达式中的子表达式可以作为整个表达式返回,也可以作为一个单独的表达式返回。所以上面的数组长度为 2。
使用子表达式是为了提取匹配的子字符串,表达式中有几个()就有几个相应的匹配字符串,顺序会依照()出现的顺序依次进行,并且()中可以使用 或"|" 进行多个选择。也就是说可以使用()对字符进行分组,并保存匹配的文本。
如果该方法使用全局匹配,则找到第一个指定字符,并存储其位置,如果再次运行 exec(),则从存储的位置(lastIndex)开始检索,并找到下一个指定字符,存储其位置。lastIndex属性是RegExp对象属性,是一个整数,标示开始下一次匹配的字符位置。看下面实例:
<script> var str = 'good good study day day up'; var re = /good/g; var arr; do{ arr = re.exec(str); console.log(arr); console.log(re.lastIndex); } while(arr !== null) /* 结果如下: 显示:["good"],点开后: "good", index , input "good good study day day up"。 lastIndex为。 显示:["good"],点开后: "good", index , input "good good study day day up"。 lastIndex为。 显示:null lastIndex为。 */ </script>
在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用 String.match() 返回的数组是相同的。但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
通过上面实例,可以看到,当第三次循环时,找不到指定的 "good",于是返回null,lastIndex值也变成0了。找到的第一个"good"的lastIndex值为4,是匹配文本最后一个字符的下一个位置。
<script> var str = 'good good study day day up'; var re = /good/g; var arr; while((arr = re.exec(str)) != null){ console.log(arr); console.log(re.lastIndex); } /* 结果如下: 显示:["good"],点开后: "good", index , input "good good study day day up"。 lastIndex为。 显示:["good"],点开后: "good", index , input "good good study day day up"。 lastIndex为。 */ </script>
这里需要注意,如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串(仍然使用旧的re),就必须手动地把 lastIndex 属性重置为 0。
无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此可以这么认为,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。
(3)、compile
compile() 方法用于在脚本执行过程中编译正则表达式,也可用于改变和重新编译正则表达式。主要作用是改变当前(re)匹配模式。
语法:RegExpObject.compile(模式, 修饰符)
模式就是正则表达式,修饰符用于规定匹配的类型,g匹配全局,i忽略大小写,gi全局匹配忽略大小写。
该方法是改变匹配模式时使用的,一般情况下,能用到的地方很少。
实例:在全局中忽略大小写 搜索"day",并用 "天" 替换,然后通过compile()方法,改变正则表达式,用 "日" 替换 "Today" 或 "day"。
<script> var str = 'Today is a beautiful day, Day day happy!'; var re = /day/gi; var str = str.replace(re, '天'); console.log(str); //输出:To天 is a beautiful 天, 天 天 happy! reg = /(to)?day/gi; reg.compile(reg); str = str.replace(reg, '日'); console.log(str); //输出:日 is a beautiful 日, 日 日 happy! </script>
8.정기신청.
정규식은 정규식이라고도 부르므로 작성할 때 과정은 JS 작성과 동일하며 먼저 생각하고 작성합니다. 가장 중요한 것은 그가 표현하고 싶은 규칙을 이해하는 것입니다. 먼저 그 모습을 유심히 관찰하여 그것이 어떤 모습으로 존재하는지, 즉 어떤 형식으로 존재하는지 살펴봅니다. 그런 다음 이 형식에 따라 표현을 작성하여 가능한지 확인합니다. 예상한 목적을 달성합니다. 그렇지 않은 경우 일반적으로 형식을 표현식으로 직접 설명하면 예상한 효과를 얻을 수 없습니다. 다행스럽게도 기본 프레임워크가 이미 존재하므로 무엇인가가 기대에 미치지 못하는 경우에만 알 수 있습니다. , 이 프레임워크를 기반으로 약간만 수정하면 최종적으로 완벽한 표현이 됩니다. 예를 들어 휴대폰 번호를 확인하는 정규식을 작성하려고 하면 휴대폰 번호가 11자리이고 모두 숫자이고 시작이 1이고 그 다음이 2자리라는 것을 누구나 알 수 있습니다. 많은 조합이 가능하고 그 뒤에 8이 붙습니다. 숫자는 임의의 숫자이므로 시작은 1이어야 하고 다음 2자리는 각 연산자가 제공하는 다양한 조합에 따라 제한되며 마지막으로 임의의 숫자 중 8자리를 입력하도록 규정할 수 있습니다. 이런 식으로 기본 프레임워크가 완성되더라도 휴대전화 번호에는 특별한 상황이 있습니다. 예를 들어 휴대전화 번호 앞에 86을 추가하는 경우도 있습니다. 필요한 경우 이러한 상황을 고려해야 합니다. 그렇지 않으면 사용자가 자신의 휴대폰 번호를 앞에 86을 추가한 후 Mention(멘션)을 클릭하면 시스템에서 입력한 내용이 울(wool)이고 시스템에서 이를 인식하지 못합니다. , 따라서 프레임워크를 수정하고 이 상황을 고려하기만 하면 됩니다.
그럼 정규 표현식은 매우 간단한 것 같지만 실제로는 꽤 어렵습니다. 왜 그렇습니까? 결국 일반 사람들이 이해하기 어려운 이런 표현인데, 쓰다보니 정확히 무슨 뜻인지 알겠더라구요. 나는 그것을 인식하지 못한다? 사실 이것은 연습이 완벽을 만들어가는 과정이다. "좋은 기억력은 나쁜 펜만큼 좋지 않다"는 글이 있었던 것으로 기억한다.