笑、少し言葉から始めましょう。昨年、私は C# を使用して、構成ファイル内の情報に基づいて、指定されたコードを HTML にフォーマットし、Web ページ上に同じ構文を表示できるようにしました。エディターでの要素の強調表示効果とコードの折りたたみのサポート。そうです、ブログで見たものと同じです。当時 MSN Space を使用していたため、この機能は提供されていなかったため、自分で作成する必要がありました。
最初は C# を使って、キーワードを判断するために、for、while、switch、if などの非常に面倒な基本的なステートメントを使用していました。正規表現がまだ使える時代だったので、この粗末な方法はまだ有効ですが、将来的にはメンテナンスが非常に困難になると思いました。他のソフトウェアではこのようには書けないので...しばらく Google で検索した後、構文強調表示を備えたコードとオープンソース プロジェクトをいくつか見つけたので、調べてみました。 。 。 。 。うわー、すべてがとても複雑です。正直に言うと、私が最もやりたくないのは、他人のコードを見ることです。非常に詳細なドキュメントの説明。そうでない場合は、一見したくありません。せいぜい、他の人がインターフェイスをどのように書いているかを見て、それが内部でどのように実装されているかを推測するだけです。
検索はあまり役に立ちませんでしたが、それでもどこで見たか忘れてしまった正規表現について知ることができました。当時、私は「壊れたもの」を改善しながら正規表現の勉強を始めました。それから間もなく、私は再び Blog Park でブログを書き始め、ついに Blog Park の構文強調表示機能を有効にしたため、HTML を強調表示する独自のコードを作成するという大きな動機を失いました。次に、C# で作成された構文強調表示モジュールはサーバー側または WinForm プログラムでのみ実行でき、最終的に取得したいのはページに表示する HTML コードであると思います。このジョブにはクライアント側のスクリプトが最適です。 JSについてはあまり詳しくないのが残念です。 。 。その後、この期間中に他のことをいじり始めましたが、構文強調表示モジュールは改善されませんでした。
昨夜残業して帰宅したのですが、当初は UML の学習を続けてパターンを確認する予定でした。その後、データベースから返された結果からすべての HTML タグを削除する必要があるモジュールがあることを思い出したので、通常のモジュールを開いてみました。表現ツール RegexBuddy。その結果、RegexBuddy のヘルプ ドキュメントで JScript で正規表現を使用するための簡単なチュートリアルを見たので、再び好奇心が芽生え、UltraEdit-32 を開いて簡単な JavaScript を作成して実験を始めました。
多くの場所で繰り返しのテストと多くの回り道が含まれるため、ここではテスト プロセスの詳細については説明しません。ここでは、テストから要約した JScript での正規表現の使用方法を直接説明します。
ナンセンスな話はこれくらいにして、本題に入りましょう。
首相はJScriptの正規表現オブジェクトRegExpについて語る。
JScript で正規表現操作を提供するクラス名は RegExp であり、RegExp タイプのオブジェクトは 2 つの方法でインスタンス化できます。
方法 1、コンストラクターのインスタンス化:
var myRegex = new RegExp(" \w +", "igm ");
//w+ は実際の正規表現です。最初の は、それぞれ大文字小文字の区別、グローバル検索、および複数行の検索を意味します。
方法 2、直接代入方法:
var myRegex = /w+/igm;
// 効果は前のステートメントと同じですが、ここで転送文字を使用する必要がない点が異なります。igm は前の例の igm と同じ効果を持ちます。
使用する具体的な方法は人それぞれの好みによって異なりますが、正規表現を記述する場合は 2 番目の方法の方が読みやすいと思います。RegexBuddy のヘルプ ドキュメントでも 2 番目の方法が推奨されています。 RegExp オブジェクトには次の操作が含まれます。
exec(string str): 正規表現の一致を実行し、一致した結果を返します。MSDN が提供する実行結果の例によれば、exec の各実行は最後の直接一致の終わりから始まります。戻り値はRerExpオブジェクトのようで、RegexBuddyの説明では配列を返すとありますが、実験結果に基づいて詳細な例は示されていないと思います。
コンパイル(string regex, string flags): 正規表現をプリコンパイルしてテスト後、プリコンパイル後の効率が大幅に向上します。 regex パラメータは正規表現であり、フラグは次の 3 つの値の組み合わせです: g – グローバル検索 私のテスト結果は、g フラグを追加しないと、最初の修飾された文字列 i – 大文字と小文字を無視して一致することのみです。 – 複数行検索はデフォルトでは複数行検索のようです
test(string str): str が正規表現に一致する場合は true を返し、そうでない場合は false を返します。この match メソッドは文字列オブジェクト RegExp オブジェクトと同様で、
次の属性を含みます
。:
index:文字列内 最初に一致する式の位置、最初は -1
input: 正規表現の一致ターゲット。読み取り専用であることに注意してください。
lastIndex: 次に一致する式の位置。元の単語は (検索された文字列内で次の一致が始まる文字位置を返します。) この属性を使用したことがないので、変換エラーがあるかどうかはわかりません。
lastMatch: 式に一致する最後の文字列
lastParen: 最後に一致した部分一致文字列。たとえば、正規表現内で () でグループ化された複数の一致がある場合、lastParen は一致した結果の最後のグループを表します。
leftContext: ターゲット文字列の先頭から最後の一致の開始位置までのすべての文字。
rightContext: 最後に一致した文字列の末尾からターゲット文字列全体の末尾までのすべての文字。
$1...$9: n 番目の一致グループの結果を示します。これは、正規表現に複数の () グループがある場合に便利です。
次に
、JScript の String オブジェクトと正規表現に関連する操作について説明します。
(文字列正規表現): 正規表現を受け入れ、文字列がその式に一致するかどうかを返します。
replace(srting regex, string str): 正規表現に一致する部分文字列を str に置き換えます。この関数は単純に見えますが、さらに高度な使用法も隠されています。次の例を参照してください。
例 1:
var str1 = "A:私の名前はピーターです!nB:こんにちはピーター!";
str1 = str1.replace(/ピーター/g,"ジャック");
アラート(str1);
この例は、文字列を置き換えるだけの単純なものです。もちろん、この式の能力はこれに限定されるものではありません。これを使用して、以前は大量のコードを必要としていた多くのタスクを実行することもできます。たとえば、コード キーワードの前後に強調表示された HTML タグを追加します。前の例から、replace は一致するテキストを新しいテキストに置き換えることしかできないようですが、キーワードの前後にタグを挿入するにはどうすればよいですか?考えてみると、置換するときに一致結果を使用できれば、キーワードをタグ ヘッダー + キーワード + タグ末尾に置き換えるだけで済みます。
しかし、正規表現の一致結果を replace で使用するにはどうすればよいでしょうか?
このとき、「マッチング変数」を使用する必要があります。マッチング変数は、通常のマッチングの結果を表すために使用されます。
$& -- すべての一致するグループの一致結果を表します。最後に、一致するグループは正規表現の () グループです。
$$ -- は $ 文字を表します。一致する変数は $ 文字を使用するため、エスケープする必要があります。
$n -- 前の $1...$9 と同様、n 番目の一致結果セットを示します。
$nn -- 単純に、nn 番目の一致グループの結果
$` -- は前述の leftContext です。たとえば、abcdefg が d と一致する場合、abc はその leftContext です。
$' -- 上記と非常に近いので、読み間違えないでください。同様に、efg は上記の例の rightContext です。したがって、キーワードの前後にタグを挿入するのは非常に簡単です。
var str1 = "A:My name is Peter!nB:Hi.ピーター!」
str1 = str1.replace(/Peter/g, "<b>$&</b>");
アラート(str1);
もう0時39分です。 。 。ここでやめましょう。
通常のツール ソフトウェア ダウンロード (パスワード: regex): regex buddy 2.06.zip
私が書いた例を参照してください: JScript 構文の強調表示 (コードの合理化)
MSDN からのいくつかの例を次に示します。
function matchDemo()
{
変数;
var re = new RegExp("d(b+)(d)","ig");
var str = "cdbBdbsbdbdz";
var arr = re.exec(str);
s = "$1 には以下が含まれます: " + RegExp.$1 + "n";
s += "$2 には以下が含まれます: " + RegExp.$2 + "n";
s += "$3 には以下が含まれます: " + RegExp.$3;
リターン;
}
関数 RegExpTest()
{
var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
if (ver >= 5.5){
var src = "スペインの雨は主に平地に降ります。";
var re = /w+/g;
変数arr;
while ((arr = re.exec(src)) != null)
print(arr.index + "-" + arr.lastIndex + "t" + arr);
}
それ以外{
alert("これを機能させるには、新しいバージョンの JScript が必要です");
}
関数
matchDemo()
{
var s; //変数を宣言します。
var re = new RegExp("d(b+)(d)","ig"); //正規表現パターン。
var str = "cdbBdbsbdbdz"; //検索する文字列。
var arr = re.exec(str); //検索を実行します。
s = "$1 は次を返します: " + RegExp.$1 + "n";
s += "$2 は次を返します: " + RegExp.$2 + "n";
s += "$3 は次を返します: " + RegExp.$3 + "n";
s += "入力は次を返します: " + RegExp.input + "n";
s += "lastMatch は次を返します: " + RegExp.lastMatch + "n";
s += "leftContext は次を返します: " + RegExp.leftContext + "n";
s += "rightContext は次の結果を返します: " + RegExp.rightContext + "n";
s += "lastParen は次を返します: " + RegExp.lastParen + "n";
return(s); //結果を返します。
}
document.write(matchDemo());
通りすがりのヒーローがこの記事について意見がある場合は、お気軽にここに投稿してください。一緒に学び、進歩していきましょう。