>  기사  >  웹 프론트엔드  >  정규식 기본 소개 및 학습 예시

정규식 기본 소개 및 학습 예시

零下一度
零下一度원래의
2017-06-26 13:41:06949검색

정규식을 사용해야 하는 상황이 자주 발생하는데, 습관적으로 검색하고, 복사하고, 붙여넣는 일이 시간이 지나면서 정규식에 대해 조금 알게 되었는데, 이제는 복잡한 표현을 읽는 것조차 어려워졌습니다. 그래서 정규식을 잘 배워보기로 했습니다. 여기서는 기본적인 것부터 시작하여 몇 가지 자주 사용하는 표현을 기록하고, 정규식을 읽는 능력을 연습하고, 자바스크립트의 regexp 객체에 대해 간략하게 소개하겠습니다.

1. 정규식 소개:

정규식: 일반 문자특수 문자로 구성된 텍스트 패턴으로, 문자열에 하위 문자열이 포함되어 있는지 확인하는 데 사용할 수 있는 문자열 일치 규칙을 설명합니다. 문자열을 바꾸거나 문자열에서 부분 문자열을 추출합니다. 정규식 작성 수학 표현식과 마찬가지로 작은 표현식을 결합하여 더 큰 표현식을 작성할 수 있습니다.

일반 문자: 일반 문자에는 메타 문자로 명시적으로 지정되지 않은 모든 인쇄 가능 및 인쇄 불가능 문자가 포함됩니다. 여기에는 모든 대문자 및 소문자, 모든 숫자, 모든 문장 부호 및 기타 기호가 포함됩니다.

인쇄되지 않는 문자
인쇄되지 않는 문자 설명
cx x로 지정된 제어 문자와 일치합니다. 예를 들어 cM은 Control-M 또는 캐리지 리턴 문자와 일치합니다. x 값은 A-Z 또는 a-z 중 하나여야 합니다. 그렇지 않으면 c는 리터럴 'c' 문자로 처리됩니다.
f 은 폼 피드와 일치합니다. x0c 및 cL과 동일합니다.
n 은 개행 문자와 일치합니다. x0a 및 cJ와 동일합니다.
r 은 캐리지 리턴 문자와 일치합니다. x0d 및 cM과 동일합니다.
s 공백, 탭, 양식 피드 등을 포함한 모든 공백 문자와 일치합니다. [fnrtv]와 동일합니다.
S 은 공백이 아닌 모든 문자와 일치합니다. [^ fnrtv]
t 와 동일하며 탭 문자와 일치합니다. x09 및 cI
v 와 동일하며 세로 탭 문자와 일치합니다. x0b 및 cK

특수 문자와 동일: 와일드카드 문자 "*"와 같이 특별한 의미가 있는 일부 문자를 찾으려면 이스케이프 문자, 즉 백슬래시를 사용해야 합니다. 문자열로.

와일드카드
특수 문자 설명
$ 입력 문자열의 끝 위치와 일치합니다.
() 하위 표현식의 시작과 끝을 표시합니다.
* 이전 하위 표현식과 0회 이상 일치합니다.
+ 이전 하위 표현식과 한 번 이상 일치합니다.
. 개행 문자 n을 제외한 모든 단일 문자와 일치합니다.
[ 대괄호 표현식의 시작을 표시합니다.
? 앞의 하위 표현식을 1회 또는 0회 일치시키거나 탐욕스럽지 않은 한정자를 지정합니다.
다음 문자를 특수 문자, 메타 문자, 역참조 또는 8진수 이스케이프 문자로 표시합니다.
^ 은 대괄호 표현식에 사용되지 않는 한 입력 문자열의 시작 부분과 일치합니다. 이 경우 문자 집합이 허용되지 않음을 나타냅니다.
{ 한정자 표현식의 시작을 표시합니다.
| 두 항목 중 하나를 선택함을 나타냅니다.

Qualifier: 한정자는 일치 항목 수를 충족하기 위해 정규 표현식의 특정 구성 요소가 몇 번이나 나타나야 하는지를 지정하는 데 사용됩니다. 일치 항목 수는 주로 {0 또는 1}, {1 또는 n을 포함하여 고정되어 있지 않습니다. }, {0 또는 1}, {n}, {n보다 크거나 같음}, {n보다 크거나 같음, m보다 작거나 같음} 6가지 유형입니다. 해당 표현식은 *, +,? ,{n},{n,},{n,m}.

Qualifier
Qualifier Description
* 이전 하위 표현식과 0회 이상 일치합니다.
+ 은 이전 표현과 한 번 이상 일치합니다.
? 이전 하위 표현식과 0번 또는 1번 일치합니다.
{n} n은 특정 횟수 n번과 일치하는 음이 아닌 정수입니다.
{n,} n은 최소 n번 일치하는 음수가 아닌 정수입니다.
{n,m} m,n은 음수가 아닌 정수 n

locator: 로케이터를 사용하면 정규식을 줄의 시작이나 끝으로 고정할 수 있습니다. 예를 들어 단어 내, 단어 시작 부분 또는 한 번 이상 끝 부분에 나타나는 정규식과 같은 특수 표현식을 만들 수도 있습니다. 로케이터는 문자열이나 단어 경계를 설명하는 데 사용됩니다.

로케이터
문자 설명
^ 입력 문자열의 시작 위치와 일치합니다. RegExp를 Multiline 속성으로 설정하면 n과 r 뒤의 위치도 일치시킬 수 있습니다.
$ 은 입력 문자열의 끝과 일치합니다. RegExp를 Multiline 속성으로 설정하면 n과 r 뒤의 위치도 일치시킬 수 있습니다.
b 단어 경계, 즉 단어와 공백 사이의 위치와 일치합니다.
B 비단어 경계 일치.

참고: 앵커 포인트에는 한정자를 사용할 수 없습니다. 개행 또는 단어 경계 앞이나 뒤에는 위치가 두 개 이상 있을 수 없으므로 "^*"와 같은 표현식은 허용되지 않습니다.

텍스트 줄의 시작 부분에 있는 텍스트를 일치시키려면 ^를 정규식의 시작 부분에 배치해야 합니다. 텍스트 줄의 끝 부분에 있는 텍스트를 일치시키려면 정규식 끝에 $를 사용하세요. ^ 또는 $의 사용을 대괄호 표현식 내부의 사용과 혼동하지 마십시오.

eg:

/^Chapter [1-9][0-9]{0,1}/ Chapter로 시작하는 두 자리 숫자로 장 제목을 일치시킵니다. 9][0-9]{0,1}$/는 장 제목의 시작과 끝과 모두 일치합니다. 즉, 이 줄에는 장 제목만 있음을 의미합니다.

/bCha/는 단어 경계, 즉 시작과 일치합니다. Cha로 시작하는 경계

/terb/ ter로 끝나는 단어.

/Bapt/, 장 일치의 apt와 같은 단어가 아닌 경계와 일치하지만 aptitude는 일치하지 않습니다.

Select

: 모든 항목을 괄호로 묶고 인접한 선택 항목 사이를 구분하려면 |를 사용하세요. 그러나 괄호 사용의 부작용은 관련 일치 항목이 캐시되어 현재 사용 가능하다는 것입니다. : 이 부작용을 제거하기 위한 첫 번째 옵션으로 두세요.

비캡처 요소:

? :원치 않는 캐싱 부작용을 제거하려면 선택 항목의 첫 번째 옵션 앞에 배치하세요. 정방향 예측은 검색 문자열이 괄호 안의 일반 패턴과 일치하기 시작하는 곳마다 일치합니다. 역방향 조회, 일반 패턴과 일치하지 않는 시작 부분의 검색 문자열을 일치시킵니다.
? =
? !

역참조: (뭔가 C언어의 재귀가 생각나네요...) 일반인의 관점에서 보면 역참조는 캐시된 패턴에 대한 참조를 의미한다고 생각하는데, 다음 글에서는 n을 통해 버퍼에 접근하는 데 사용됩니다. . 정규식 패턴이나 패턴의 일부 주위에 괄호를 추가하면 관련 일치 항목이 임시 버퍼(하위 문자열과 유사)에 저장됩니다. 제가 처음에 말한 것을 기억하세요. 정규식은 작은 간단한 표현식으로 구성된 수학적 표현식과 같습니다. . 표현식은 크고 복잡한 표현식으로 결합되며 이러한 임시 버퍼는 작은 표현식의 일치 결과로 이해될 수 있으며 캡처된 각 부분 일치는 표현식의 왼쪽에서 오른쪽 순서로 저장됩니다. 버퍼 번호는 1부터 시작하며 최대 99개의 캡처된 하위 표현식을 저장할 수 있습니다. 각 버퍼는 n으로 액세스할 수 있습니다. 여기서 n은 특정 버퍼를 식별하는 한 자리 또는 두 자리 십진수입니다. 비캡처 메타문자를 사용할 수 있나요? :,? =,? ! 캡처를 무시하고 관련 일치 항목의 캐싱을 무시합니다.

역참조의 가장 간단하고 유용한 응용 프로그램 중 하나는 텍스트에서 두 개의 동일한 인접 단어의 일치 항목을 찾는 기능을 제공합니다.

eg1: 동일한 단어 추출.

var str=휘발유 가격이 오르는 건가요?

var patt1= /b([a-z]+) 1b/; ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ document.write(str.match(patt1));

eg2: URL을 분할하면 실제로는 참조 또는 큰 표현식 하위 키 추출 사용해보니 이 역참조가 약간 모호한 것 같습니다. (지금은 여기에 저장하고 나중에 수정하세요.) var patt1 = /(w+

)

://([^/:]+)(:d*)?([ ^# ]*)/;

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

arr = str.match(patt1); 둘째, 정규식 읽기 연습을 하세요. 1./chapter [1-9][0-9]/이 표현식은 장 + 모든 정수(예: 1, 19, 109, 10099..)와 일치합니다. . . . 우선 이전 장이 고정되고, [1-9]도 고정되고, 그 다음 [0-9]가 한정자 *로 한정되는데, 이는 0번 또는 여러 번 나타날 수 있다는 뜻입니다. 따라서 비어 있거나 1비트 또는 여러 비트일 수 있습니다. 2./[a-zA-z]+://[^s]*/일치 URL3./d{3}-d{8}|d{4}-{7,8 }/국내 전화번호와 일치4.[1-9][0-9]{4,}Tencent QQ 번호와 일치5.[1-9]d{5}(?!d) 국내 우편번호 일치6.^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9]|X) $는 18자리 ID 번호와 일치합니다. 7.^[1-9]d*$

는 양의 정수와 일치합니다.

8.^-[1-9]d*

는 음의 정수와 일치합니다.

9. ^-?[1-9]d*$

정수와 일치

10.^[1-9]d*.d*|0.d*[1-9]d*$

양수 부동과 일치 포인트 숫자

11.^-[1-9]d*.d*|-0.d*[1-9]d*$

음수 부동 소수점 숫자와 일치

3, JavaScript의 RegExp 객체

1.

정규식 표현식 개체 만들기

:

new RegExp(

pattern

,

attributes

)

pattern 매개변수는 문자열인 정규식을 참조하며, 속성은 g, i, m을 포함한 선택적 매개변수입니다. . 전역 일치, 대소문자 구분 및 여러 줄 일치를 각각 참조하세요.

2.

RegExP 개체의 속성

:

global: RegExp 개체에 플래그 m이 있는지 여부

eg: if (

) { Alert("전역 속성이 설정되었습니다."); };

ignoreCase: RegExp 개체에 플래그 m이 있는지 여부

laseIndex: 다음 일치가 시작되는 문자 위치를 표시하는 정수

multiline: RegExp 개체에 플래그 m이 있는지 여부; 정규식의 원본 텍스트입니다.

3.

RegExp 개체의 메서드

:

compile: 정규식을 컴파일합니다.

compile()에는 두 가지 용도가 있습니다. 첫 번째는 스크립트 실행 중에 정규식을 컴파일하는 것입니다. 두 번째는 정규 표현식을 변경하고 다시 컴파일하는 것입니다. eg: RegExpObject.compile(regexp,modifier); 첫 번째 매개 변수는 정규 표현식이고 두 번째 매개 변수는 일치하는 유형을 지정합니다.

exec:检索字符串中指定的值,返回找到的值并确定其位置。

eg:RegExpObject.exec(string);//返回一个结果,用于存放匹配的数组,如果未找到匹配,则为null。

说明:

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

提示和注释

重要事项:如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。

提示:请注意,无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。

var str = "正则表达式的exec方法测试"; 
var patt = new RegExp("exec","g");var result;while ((result = patt.exec(str)) != null)  {
          document.write('result:'+result);
            document.write("<br />");
            document.write('patt.lastIndex:'+patt.lastIndex);
          }

test:检索字符串中指定的值,返回true或false。

eg:var result = patt1.test(str);

4.支持正则表达式的string对象的方法

search:检索与正则表达式相匹配的值。

stringObj.search(regexp);//参数可以是子串,也可以是regexp对象。

注意:search()方法不执行全局匹配,它将忽略标志g,它同时忽略regexp的lastIndex属性,并且总是从字符串开始进行检索,所以他的返回值始终是sgringObj的第一个匹配的位置。如果要忽略大小写应追加i标记。

document.write(str.search(/abc/i);

match:找到一个或多个正则表达式的匹配。

stringObj.match(searchValue);//参数为要检索的字符串值

stringObj.match(regexp);//要匹配的模式的regexp对象。

返回存放匹配结果的数组。该数组的内容依赖于regexp是否具有全局属性g;

说明

match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。

eg:document.write(str.match(/\d+/g));

replace:替换与正则表达式匹配的子串。

stringObect.replace(regexp/substr,replacement);

regexp/substr:必须,正则表达式或者自字符串。

replacement):一个字符串值,规定了替换文本或生成替换文本的函数。

返回一个新的字符串,使用replacement替换第一次匹配或者所有匹配之后得到的。注意:指定g全局变量则替换所有的匹配,否则只替换第一次匹配到的字符串。

split:把字符串分割为字符串数组。

stringObect.split(separator,howmany);

separator:必须,字符串或正则表达式,从该参数指定的地方分割字符串;

howmany:可选,指定返回数组的最大长度,若设置了该参数,返回的子串不会多余这个参数指定的数组,如果没有设置该参数,整个字符串都会被分割。

返回一个字符串数组,不包括separator本身。

 

<br><br>

위 내용은 정규식 기본 소개 및 학습 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.