正規表現の基礎入門と学習例

零下一度
リリース: 2017-06-26 13:41:06
オリジナル
944 人が閲覧しました

私は正規表現を使用する必要がある状況に頻繁に遭遇し、常に習慣的に検索、コピー、ペーストを行っていますが、時間が経つにつれ、以前は正規表現について少しは知っていましたが、今では複雑な表現を読むことさえ難しくなりました。したがって、ここでは、基本から始めて、いくつかの一般的な表現を記録し、正規表現を読み取る能力を練習し、JavaScript の 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 回以上一致します。
+ 前の部分式と 1 回以上一致します。
. 改行文字 n を除く任意の 1 文字と一致します。
[ 角括弧式の始まりを示します。
? 先行する部分式と 1 回または 0 回一致するか、非貪​​欲修飾子を指定します。
次の文字を特殊文字、メタキャラクター、後方参照、または 8 進エスケープ文字としてマークします。
^ は、角括弧式で使用されない限り、入力文字列の先頭と一致します。角括弧式で使用される場合は、文字セットが受け入れられないことを示します。
{ 修飾子式の始まりをマークします。
| 2 つの項目の間の選択を示します。

修飾子: 修飾子は、一致数を満たすために正規表現の特定のコンポーネントが何回出現する必要があるかを指定するために使用されます。一致数は固定されておらず、主に {0 または 1}、{1 または n が含まれます。 }、{0または1}、{n}、{n以上}、{n以上、m以下}の6種類。対応する式は *、+、? です。 、{n}、{n,}、{n,m}。

Qualifier
Qualifier Description
* 直前の部分式と 0 回以上一致します。
+ は、前の式と 1 回以上一致します。
? 先行する部分式と 0 回または 1 回一致します。
{n} n は、特定の回数 n 回一致する非負の整数です。
{n,} n は、少なくとも n 回一致する非負の整数です。
{n,m} m,n は非負の整数、n

ロケーター: ロケーターを使用すると、行の先頭または末尾に正規表現を固定できます。また、単語内、単語の先頭、または 1 回以上の単語の末尾に現れる正規表現などの特別な表現を作成することもできます。ロケーターは、文字列または単語の境界を記述するために使用されます。

ロケーター
文字 説明
^ 入力文字列の開始位置と一致します。 RegExp を Multiline 属性に設定すると、n と r の後の位置を一致させることもできます。
$ は、入力文字列の末尾と一致します。 RegExp を Multiline 属性に設定すると、n と r の後の位置を一致させることもできます。
b は、単語の境界、つまり単語とスペースの間の位置に一致します。
B 非単語境界のマッチング。

注: アンカー ポイントで修飾子を使用することはできません。改行または単語境界の前後に複数の位置を指定することはできないため、「^* のような式」は使用できません。

テキスト行の先頭のテキストと一致するには、正規表現の先頭に ^ を配置する必要があります。テキスト行の末尾のテキストと一致するには、正規表現の末尾に $ を使用します。この ^ または $ の使用と、括弧内での式の使用を混同しないでください。

例:

/^Chapter [1-9][0-9]{0,1}/ Chapter で始まる 2 桁の章タイトルと一致します

/^Chapter [1- 9][0-9]{0,1}$/ は章のタイトルの先頭と末尾の両方に一致します。つまり、この行には章のタイトルのみが含まれます。

/bCha/ は単語の境界、つまり始まりに一致します。 Cha で始まる境界を持つ

/terb/ ter で終わる単語。

/Bapt/、章一致の apt などの単語以外の境界に一致しますが、aptitude は一致しません。

Select: 隣接する選択項目の間のすべての項目を括弧で囲みます。スペースを区切るには | を使用します。しかし、括弧を使用すると、関連する一致がキャッシュされ、この時点で利用可能になるという副作用があります。 : この副作用を排除する最初のオプションとして入れます

非キャプチャ要素:

? : キャッシュの不要な副作用を排除するには、選択範囲の最初のオプションの前に配置します。
? = 前方参照。括弧内の通常のパターンと一致し始める検索文字列と一致します。
? ! 逆事前検索。通常のパターンに一致しない任意の開始位置で検索文字列を照合します。

後方参照: (不可解ですが、私は C 言語の再帰について考えています...) 平たく言えば、後方参照とは、次の記事で n を介してバッファーにアクセスするために使用される、キャッシュされたパターンへの参照を指すと思います。 。正規表現パターンまたはパターンの一部をかっこで囲むと、関連付けられた一致が一時バッファー (部分文字列と同様) に保存されます。最初に述べたことを思い出してください。正規表現は数式のようなもので、小さな単純な式で構成されます。式は大きな複雑な式に結合され、これらの一時バッファはそれらの小さな式の一致結果として理解でき、キャプチャされた各部分一致は式の左から右の順序で保存されます。バッファ番号は 1 から始まり、最大 99 個のキャプチャされた部分式を保存できます。各バッファには n 単位でアクセスできます。n は、特定のバッファを識別する 1 桁または 2 桁の 10 進数です。非キャプチャーメタキャラクターは使用できますか? :、? =、? !キャプチャをオーバーライドし、関連する一致のキャッシュを無視します。

後方参照の最も単純で最も便利なアプリケーションの 1 つは、テキスト内で隣接する 2 つの同一の単語の一致を検索する機能を提供します。

eg1: 同一の単語を抽出します。

var str=これはガソリン代が上がっているのですか?

var patt1= /b([a-z]+) 1b/;

document.write(str.match(patt1));

この例から、URL を分割します。または 大きな式のサブキーを抽出すると使用すると、この後方参照は少しわかりにくいように感じます。 (とりあえずここに置いて、メモしておき、後で修正します); varpatt1=/w+:// ^#

]

*)/;

arr = str.match(patt1);

2 番目に、正規表現を読む練習をします。

1./chapter [1-9][0-9]/

この式は、chapter + 1、19、109、10099 などの任意の整数に一致します。 。 。 。

まず、前の章が固定され、[1-9] も固定され、次に [0-9] が修飾子 * で修飾されます。これは、0 回または複数回出現できることを意味します。したがって、空、1 ビット、または複数ビットにすることができます。

2./[a-zA-z]+://[^s]*/

一致する URL

3./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。 正規表現 Expression オブジェクトを作成する :

new RegExp(pattern, attributes);
pattern パラメータは文字列である正規表現を参照し、attributes は g、i、m を含むオプションのパラメータです。 。それぞれ、グローバル マッチング、大文字と小文字を区別するマッチング、および複数行のマッチングを指します。

2.RegExP オブジェクトのプロパティ:

global: RegExp オブジェクトにフラグ m があるかどうか

例: if (patt1.global) { alert("グローバル プロパティが設定されました");

ignoreCase: RegExp オブジェクトにフラグ m があるかどうか;

laseIndex: 次の一致が始まる文字位置をマークする整数;

multiline: RegExp オブジェクトにフラグ m があるかどうか。正規表現の元のテキスト。

3.

RegExp オブジェクトのメソッド

:

compile

: 正規表現をコンパイルします。 compile() には 2 つの用途があります。1 つ目は、スクリプトの実行中に正規表現をコンパイルすることです。 2 つ目は、正規表現を変更して再コンパイルすることです。例: RegExpObject.compile(regexp,modifier);

最初のパラメータは正規表現で、2 番目のパラメータは一致するタイプを指定します。

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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート