>  기사  >  웹 프론트엔드  >  JS 일반 한 줄 모드에 대한 자세한 설명

JS 일반 한 줄 모드에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-03-29 16:15:381517검색

이번에는 JS 일반 한 줄 모드에 대한 자세한 설명을 가져왔습니다. JS 일반 한 줄 모드 사용 시 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.

정규식은 1970년 Ken Thompson이 개선한 QED 편집기에서 처음 구현했습니다. 당시 정규식에서 가장 간단한 메타 문자 "."는 줄 바꿈을 제외한 모든 문자와 일치했습니다. 을 제외한 모든 문자와 일치합니다.

위 문장은 역사상 최초의 정규 문서일 수 있는 1970년 QED의 공식 문서에서 나온 것입니다.

왜 그런 규칙이 있는 걸까요? QED는 라인 단위로 파일을 편집하는데, 라인 끝의 줄 바꿈 문자도 이 라인의 내용에 포함되기 때문입니다. 예를 들어, 코드 조각에서 모든 한 줄 주석을 삭제하려면 QED에서 다음 명령을 사용할 수 있습니다.

1,$s#//.*##

"."가 개행 문자와 일치할 수 있으면 개행 문자도 삭제됩니다. 그 결과 다음 줄이 병합되는데 이는 일반적으로 우리가 원하는 것이 아니므로 "."는 처음 개발되었을 때 개행 문자와 일치하지 않도록 설계되었습니다. 현재 운영 체제에는 테스트할 QED 명령이 없지만 여전히 VIM이 있으며 같은 이유로 VIM의 "."는 줄 바꿈 문자와 일치할 수 없습니다.

Node와 달리

파일 읽기

는 일반적으로 한 번에 전체 파일을 읽습니다. Perl은 다음과 같이 파일을 한 줄씩 읽는 많은 Linux 명령의 전통을 계승합니다.

while (<>) {print $_}
_에도 끝에 개행 문자가 있습니다. 그래서 Perl "."이 개행 문자와 일치하지 않는다는 QED의 규칙을 상속받는 것도 당연합니다. 하지만 Perl은 결국

프로그래밍 언어

이며 정규식이 일치해야 하는 개체는 한 줄의 텍스트일 뿐만 아니라 여러 줄의 텍스트일 수도 있습니다. ."에는 교차 라인 일치가 있습니다. 따라서 Perl은 "."가 개행 문자와도 일치할 수 있도록 하는 일반 단일 행 모드 /s를 발명했습니다. Perl에서 한 줄 모드를 켜는 데 사용되는 /s 수정자에 대한 공식 설명은 "문자열을 한 줄로 처리"입니다. 이 "한 줄"은 다음과 같이 이해해야 합니다. "." 한 줄 모드가 아닌 일반 모드에서 Perl은 여러 줄 문자열을 한 줄로 처리하고 개행 문자를 인라인 문자로 처리하므로 "."이 일치할 수 있습니다. 좀 더 명확하게 말하면, 다음 세 줄의 텍스트

1
2
3

는 "1n2n3n" 한 줄의 텍스트로 간주됩니다. 이것이 바로 한 줄 모드를 의미합니다.

하지만 끔찍한 점은 같은 이유로(문자열 변수에 여러 줄의 텍스트가 포함될 수 있음) Perl도 여러 줄 모드인 /m 수정자를 발명했다는 것입니다. 공식적인 설명은 "문자열을 여러 줄로 처리"입니다. . 이 모드

JavaScript

는 고대부터 일반 규칙에 포함되었습니다. 여기서 "여러 줄"은 다음을 의미합니다. ^ 및 $ 메타 문자는 기본적으로 문자열 중간에 있는 개행 문자 앞과 뒤의 위치와 일치하지 않습니다. 즉, 문자열은 항상 한 줄만 가지는 것으로 간주됩니다. Open 여러 줄 모드 이후에 일치할 수 있습니다. 즉, 한 줄 모드와 여러 줄 모드는 서로 다른 메타 문자를 위한 것입니다. 정규식을 처음 접하는 사람들은 "한 줄 모드"와 "다중 줄 모드"로 혼동할 것 같습니다. 대응하지만 실제로는 전혀 관련이 없는 명사로 인해 혼동됩니다.

나중에 Ruby의 작성자는 "한 줄 모드"라는 정규 용어가 잘 사용되지 않는다고 느꼈을 수도 있으므로 줄 바꿈 문자와 일치하는 "."의 모드를 "다중 줄 모드", 즉 . * 등 정규식은 여러 줄을 일치시킬 수 있으므로 수정자도 /m을 사용합니다(Ruby는 기본적으로 Perl에서 "여러 줄 모드"를 활성화하므로 /m은 실제로 추가되지 않습니다). 부상을 모욕하고 더욱 혼란스럽게 만듭니다.

나중에 Python 작성자도 "한 줄 모드"라는 용어를 피해야 한다고 느낄 수도 있으므로 도트가 모든 문자와 일치할 수 있다는 의미로 "dotall"이라는 새 이름을 붙였습니다. 이상 Java 이 이름도 사용되었습니다.

上面回顾了一下历史,解释了下单行模式的由来以及说明了下单行模式这个名字起得不好。V8 最近刚刚实现了一个 stage 3 的 ES 提案 https://github.com/mathiasbynens/es-regexp-dotall-flag,这个提案为 JavaScript 的正则引入了 /s 修饰符和 dotAll 属性,dotAll 属性是学了 Python 和 Java,/s 修饰符是继承了 Perl 的,这里也没必要发明一个新的修饰符比如 /d,只会让事情更复杂。/s 在 JavaScript 的具体效果是让 “.” 能匹配以前不能匹配的四个行终止符:\n(换行)、\r(回车)、\u2028(行分隔符)、\u2029(段落分隔符):

/foo/s.dotAll // true
/^.{4}$/s.test("\n\r\u2028\u2029") // true

其实就是个很简单的东西,但可能一些没有接触过 JavaScript 以外的正则的同学到时候学到这个新的模式后会产生困惑,这里再澄清一下:多行模式控制的是 ^ 和 $ 的表现,单行模式控制的是 “.” 的表现,两者没有直接关系。

然而当初引入单行模式和多行模式这两个易混淆概念的 Perl 语言,已经在 Perl 6 中完全删除了这两个模式:“.” 号默认就匹配换行符,\N 可以匹配换行符除外的任意字符;^ 和 $ 始终匹配字符串的首尾,而新引入了 ^^ 和 $$ 两个元字符来匹配行的首尾。

过去我们常用的单行模式的替代品 [^] 或者 [\s\S] 也不是完全没有用了,比如在一些使用 JavaScript 正则的编辑器里(VS Code、Atom),不太可能给你提供开启单行模式的界面。不过说起编辑器里的正则功能,用 JavaScript 实现的编辑器的正则功能还是太弱了,比如不能在正则自身内部开启某些模式,比如要是在 Sublime(使用 Python 正则)里的话,在正则内部使用 (?s) 就能开启 dotall 模式,比如可以用 (?s)/\*.+?\*/ 匹配到所有的多行注释。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

在正则中怎么使用环视

正则表达式怎么匹配图片地址与img标签

위 내용은 JS 일반 한 줄 모드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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