RegExp のレビュー

何かが動いていると感じたら、長い間使わないと忘れてしまうので記録しておいて…。


正規表現

定期的に

  • エスケープ記号 ->\
  • エスケープ文字->+エスケープ文字
  • 引用符の問題
var str = "我是一名"牛逼"的程序员";// 语法错误 ,牛逼是一个变量,变量和字符串直接应该有加号
var str = "我是一名"+牛逼+"的程序员"//引用错误,牛逼这个变量没有被定义

var str = "我是一名\"牛逼\"的程序员";
// '我是一名"牛逼"的程序员'

var str = "我是一名\\牛逼\\的程序员";
// '我是一名\牛逼\的程序员'
  • n、r、t
  1. \n 改行
var str = "我是一名\n牛逼\n的程序员";
console.log(str) //1. 浏览器控制台换行

document.write(str) //2. document没有换行
// 我是一名 牛逼 的程序员  显示为空格
  • エディタ、コンソールなどの編集システムの改行はすべて \n
  • HTMLはプレーンテキスト表示なので改行は\n\rですが、\nだけは認識できないのでスペースとして表示されます。

window->キャリッジ リターンとライン フィード+\r\n
mac->キャリッジ リターンとライン フィード+\r
linux->キャリッジ リターンとライン フィード+\n

  1. \t タブ文字、スペース 4 つ
  • 文字列の改行
var str = "我是一名
            牛逼
            的程序员"

// 转义,把回车换行转义成空格,这是系统默认加的
var str = "我是一名\
            牛逼\
            的程序员"

リテラル、コンストラクター、フラグパラメータ (i、g、m)

var reg = new RegExp('Test','i'); 
var str = 'this is Test'
reg.test(str) //true

var reg = new RegExp('test','i'); //ignore case 忽略大小写
var str = 'this is Test,i am test2'
str.match(reg) //['Test', index: 8, input: 'this is Test,i am test2', groups: undefined]
// 只匹配了第一个Test

//全匹配 
var reg = new RegExp('test','ig'); //g 全局匹配 global
var str = 'this is Test,i am test2'
str.match(reg) //['Test', 'test']

var reg = new RegExp('^test','igm'); //m 多行匹配 multi-line
var str = 'this is Test,\ntest is now'
str.match(reg) //['test']


// 字面量 不用写引号
var reg = /test/ 
var str = 'this is test'
reg.test(str) //true
// 忽略大小写
var reg = /test/i 
var str = 'this is Test'
reg.test(str) //true
  • 正規表現にはリテラルまたは新しいオブジェクトを使用する必要がありますか?
    正規リテラルを使用することをお勧めします。正規表現に変数も含まれる場合は、インスタンス化されたオブジェクトでのみ宣言できます。

  • 比較した

 var reg = /test/;
 var newReg = new RegExp('test');
//  reg 和  newReg 是不同的两个对象

var reg = /test/;
reg.a = 1;
var newReg = RegExp('test');
console.log(newReg.a)
// 也是不同的两个对象

var reg = /test/;
var newReg = RegExp(reg); //这个它两是相同的引用

var reg = /test/;
var newReg = new RegExp(reg);
// 不同的两个对象

表現[]

[xyz]

キャラクターのコレクション。角括弧内の任意の文字と一致します

たとえば、[abcd] と [ad] は同じです。これらはすべて「brisket」の「b」と一致し、「city」の「c」とすべて一致します。

var str = "0154eer878we232";
var reg = /[12345678][12345678][12345678]/g;
str.match(reg) //(3) ['154', '878', '232']

var str = "015284eer878we232";
var reg = /[12345678][12345678][12345678]/g;
str.match(reg) //(3)  ['152', '878', '232']
// 匹配过的不再匹配
  • [0-9]
  • [AZ]、[Az] (小文字から大文字に変更することはできません: 無効な正規表現: /[0-9a-Z]/: 文字クラスの範囲が間違っています)
  • [az]
  • [0-9A-Z]

[^xyz]

逆文字セット。つまり、角括弧で囲まれていない任意の文字と一致します。ダッシュ (-) を使用して文字の範囲を指定できます。ここでは通常のキャラクターが機能します。

たとえば、[^abc] と [^ac] は同じです。これらは、「ブリスケット」の「r」と「チョップ」の「h」に一致します。

x|y

「x」または「y」と一致します。

たとえば、/green|red/ は、「green apple」の「green」、「red apple」の「red」に一致します。

var reg = /green|red/g
var str = 'green apple'
console.log(str.match(reg))//['green']

メタキャラクター

メタキャラクターは 1 つのビットと一致します

\w、\w

  • w -> [0-9A-z]
  • W -> [^\w]
var reg = /\wab/g
var str = '2345abc-avc'
str.match(reg) //['5ab']

var reg = /\Wab/g
var str = '2345abc-ab'
str.match(reg) //['-ab']

var reg = /[\W][\w][\w]/g
var str = '2345abc-ab'
str.match(reg) //['-ab']

\d、\D

  • d -> [0-9]
  • D -> [^\d]

\s、\s

s は、スペース、タブ、フォーム フィード、改行文字を含む空白文字と一致します。
s -> [\r\n\t\v\f]
S -> 空白文字以外の文字と一致します。

  1. たとえば、 /\s\w*/ は、「foo bar」の「 bar 」と一致します。
  2. たとえば、/\S\w*/ は、「foo bar」の「foo」と一致します。
var reg = /\sab/g
var str = '23\nab'
console.log(str.match(reg))

\b、\B

b-> 単語境界に一致します

var reg = /\bthis\b/g
var str = 'this is a test'
console.log(str.match(reg))//['this']

var reg = /\Bhis\b/g
var str = 'this is a test'
console.log(str.match(reg))//['his']

(小数点) デフォルトでは、改行を除く任意の 1 文字と一致します。

var reg = /.n/g
var str = 'nay, an apple is on the tree'
console.log(str.match(reg))//(2) ['an', 'on']

通常の数量指定子

  • 振り返るな
  • 貪欲モード

+

前の式と 1 回以上一致します。{1,} と同等。

var reg = /\w+/g
var str = '1@candy#23'
str.match(reg)// ['1', 'candy', '23']

*

前の式と 0 回以上一致します。{0,} に相当

var reg = /\w*/g
var str = '1@candy#23'
str.match(reg)// (6) ['1', '', 'candy', '', '23', '']

var reg = /\d*/g
var str = 'abcde'
str.match(reg)//(6) ['', '', '', '', '', '']
// 字符串从左到右依次匹配多,如果一旦匹配上就不回头
// 贪婪匹配原则:能匹配多个绝不匹配少个
// 1a2b3c4d5e6
// 每个光标处都会匹配到 6 

var reg = /\w*/g
var str = 'abcde'
str.match(reg) //(2) ['abcde', '']

var reg = /\d*/g
var str = 'sdf12'
str.match(reg) //(5) ['', '', '', '12', '']
// \d* 是匹配连续的0个或多个数字。并且是贪婪匹配,能匹配2个时就不会只匹配1个。
// 结果是 ['', '', '', '12', '']
// 因为\d* 可以匹配0个数字,也就等同匹配空字符串''
// 第1次的''是匹配s前面的空字符串
// 第2次的''是匹配d前面的空字符串
// 第3次的''是匹配f前面的空字符串
// 第4次'12'是能匹配2个时就不会只匹配1个。
// 第5次的''是匹配字符串结尾前的空字符串
  • 0 回と複数回で、+ よりも空の文字列が 1 つ多くなります。

最初に貪欲なマッチングを行い、次に空の文字列をマッチングします。

?

前の式と 0 回または 1 回一致します。{0,1} に相当します。

var reg = /\d?/g
var str = 'abcde'
str.match(reg) //(6) ['', '', '', '', '', '']

var reg = /\w?/g
var str = 'abcde'
str.match(reg) //(6) ['a', 'b', 'c', 'd', 'e', '']

量指定子 *、+、?、または {} の後に続く場合、量指定子は非貪欲 (できるだけ少ない文字に一致する) になり、デフォルトの貪欲モード (できるだけ多くの文字に一致する) の正反対になります

たとえば、「123abc」に /\d+/ を使用すると「123」と一致しますが、/\d+?/ を使用すると「1」のみと一致します。

var reg = /\d+/g
var str = '123abc'
str.match(reg) //['123']

var reg = /\d+?/g
var str = '123abc'
str.match(reg) // ['1', '2', '3']

var reg = /\d?/g
var str = '123abc'
str.match(reg) //['1', '2', '3', '', '', '', '']

{n,m}

n と m は両方とも整数です。前の文字と少なくとも n 回、最大で m 回一致します。n または m の値が 0 の場合、この値は無視されます。

var reg = /\w{1,2}/g
var str = 'abcdefg'
str.match(reg)//(4) ['ab', 'cd', 'ef', 'g']
  • 注: 正規表現内のスペースは実スペースです

{n,}

n は、少なくとも n 回出現する前の文字と一致する正の整数です。

{n}

n は正の整数で、前の文字と正確に n 回一致します。

^

入力の先頭と一致します。複数行フラグが true に設定されている場合、改行文字の直後の位置も照合されます。

たとえば、/^A/ は、「an A」の「A」には一致しませんが、「An E」の「A」には一致します。

$

入力の末尾と一致します。複数行フラグが true に設定されている場合、改行文字の前の位置も照合されます。

たとえば、/t$/ は、「eater」の「t」とは一致しませんが、「eat」の「t」とは一致します。

// 匹配abc开头,abc结尾的字符
var reg = /^abc\w*abc$/g
var str = 'abcdefgabc'
str.match(reg)//['abcdefgabc']

var reg = /^abc[\w]*abc$/g
var str = 'abcdefgabc'
str.match(reg)//['abcdefgabc']

var reg = /[^abc][abc$]/g
var str = 'abcdefgabc'
str.match(reg)//['abcdefgabc']

部分式 (x) と後方参照

これは「x」と一致し、その一致を記憶します。括弧はキャプチャー括弧と呼ばれます。

  • /(foo) (bar) \1 \2/ パターンの「(foo)」と「(bar)」は、文字列「foo bar foo bar」の最初の 2 つの単語と一致し、記憶されます。

    var str = 'foo bar foo bar'
    var reg =  /(foo) (bar) \1 \2/
    str.match(reg)
    //(3) ['foo bar foo bar', 'foo', 'bar', index: 0, input: 'foo bar foo bar', groups: undefined]
    //=====================
    var str = 'abcabc'
    var reg = /bc/
    str.match(reg) //['bc', index: 1, input: 'abcabc', groups: undefined]
    // 加括号捕获子表达式
    var str = 'abcabc'
    var reg = /(b)(c)/
    str.match(reg) //(3) ['bc', 'b', 'c', index: 1, input: 'abc', groups: undefined]
    // 不捕获子表达式b
    var str = 'abcabc'
    var reg = /(?:b)(c)/
    str.match(reg)// (2) ['bc', 'c', index: 1, input: 'abcabc', groups: undefined]
    
    
  • パターン内の \1 と \2 は、キャプチャ括弧で一致する最初と 2 番目の部分文字列、つまり foo と bar を表し、元の文字列の最後の 2 つの単語と一致します。これは後方参照です

  • \1、\2、...、\n は正規表現の一致リンクで使用されることに注意してください。

  • 正規表現の置換処理では、$1、2、...、2、...、のような単語を使用する必要があります。2 , . . . , n このような構文、たとえば、'bar foo'.replace(/(…) (…)/, '$21 ' )。1')。1)_ & は、照合に使用される元の文字列全体を表します。

var reg = /(foo) (bar) \1 \2/g
var str = 'foo bar foo bar'
str.match(reg)//['foo bar foo bar']

前方参照

x(?=y) 先読みアサーション

「x」の後に「y」が続く場合にのみ「x」と一致します。これは先読みアサーションと呼ばれます。

先読みアサーションは、次に出現する文字セットが特定の文字セットであるかどうかを確認するために使用されます。

x(?!y) 前方否定検索

「x」の後に「y」が続かない場合にのみ「x」と一致します。これは前方否定検索と呼ばれます。

前方ネガティブ検索では、次に表示されるべきではない特定の文字列セットがチェックされます。

(?:x) 捕捉されない括弧

「x」と一致しますが、一致を覚えていません。このようなブラケットは非キャプチャブラケットと呼ばれます

RegExpProperties

  1. RegExp.prototype.global は、
    文字列内で一致する可能性のあるすべての一致、または最初の一致のみに対して正規表現をテストします。

  2. RegExp.prototype.ignoreCase
    テキストを照合するときに大文字と小文字を無視するかどうか。

  3. RegExp.prototype.multiline が複数行の検索を実行する
    かどうか。

  4. RegExp.prototype.source
    正規表現のテキスト。

  5. RegExp.lastIndex 静的プロパティ
    次の一致を開始する場所を示すインデックス

RegExp メソッド

テスト()

test() メソッドは検索を実行して、正規表現が指定された文字列と一致するかどうかを確認します。true または false を返します。

let str = 'hello world!';
let result = /^hello/.test(str);
console.log(result);
// true

実行()

  • 通常の一致反復子

exec() メソッドは、指定された文字列内で検索一致を実行します。結果の配列または null を返します。

var myRe = /ab*/g; //如果没有g 永远匹配第一项,永远不会有null,下面的判断会死循环
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
    
    
    // 循环判断exec返回null之后又会从从头开始匹配
  var msg = 'Found ' + myArray[0] + '. ';
  msg += 'Next match starts at ' + myRe.lastIndex;//lastIndex是可以修改的
  console.log(msg);
}
// Found abb. Next match starts at 3 。 ['abb', index: 0, input: 'abbcdefabh', groups: undefined]
// Found ab. Next match starts at 9 。  ['ab', index: 7, input: 'abbcdefabh', groups: undefined]

マッチエグゼクティブ

貪欲モードと非貪欲モード

var str = "abc{
    
    {def}}abc{
    
    {xyz}}";
var reg = /{
     
     {.*}}/g
str.match(reg)  //['{
    
    {def}}abc{
    
    {xyz}}']
//本意是想匹配{
    
    {def}}和{
    
    {xyz}}
//任何语言的正则都是贪婪模式

var reg = /{
     
     {.*?}}/g //?将贪婪模式变为非贪婪模式
str.match(reg)   // ['{
    
    {def}}', '{
    
    {xyz}}']

var str = 'aaaaaa';
var reg = /\w?/g //贪婪模式  问号匹配零次或一次,贪婪模式优先匹配一次
str.match(reg) //(7) ['a', 'a', 'a', 'a', 'a', 'a', '']

var reg = /\w??/g  //+? 非贪婪
str.match(reg) //(7) ['', '', '', '', '', '', '']

おすすめ

転載: blog.csdn.net/uotail/article/details/124718922