5

現在、VC++ 2010 を使用していますが、syntax_option_typeVC++ 2010 には次のオプションしか含まれていません。

static const flag_type icase = regex_constants::icase;
static const flag_type nosubs = regex_constants::nosubs;
static const flag_type optimize = regex_constants::optimize;
static const flag_type collate = regex_constants::collate;
static const flag_type ECMAScript = regex_constants::ECMAScript;
static const flag_type basic = regex_constants::basic;
static const flag_type extended = regex_constants::extended;
static const flag_type awk = regex_constants::awk;
static const flag_type grep = regex_constants::grep;
static const flag_type egrep = regex_constants::egrep;

perl_syntax_group は含まれていません (Boost Library にはオプションがあります)。ただし、Boost ライブラリは使用したくありません。

Perl で書かれた正規表現はたくさんあるので、既存の Perl 正規表現ECMAScript(または VC++ 2010 がサポートする任意のもの) に変換したいと考えています。変換後、サードパーティのライブラリを使用せずに、同等の正規表現を VC++ 2010 で直接使用できます。

一例:

const boost::tregex e(__T("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"));
const CString human_format = __T("$1-$2-$3-$4");
CString human_readable_card_number(const CString& s)
{
   return boost::regex_replace(s, e, human_format);
}
CString credit_card_number = "1234567887654321";
credit_card_number = human_readable_card_number(credit_card_number);
assert(credit_card_number == "1234-5678-8765-4321");

上記の例でやりたいことは、式をスタイルに変換するeことformatですECMAScript

ECMAScriptすべての Perl 正規表現をスタイルに変換する一般的な方法を見つけることは可能ですか? これを行うためのツールはありますか?

どんな助けでも大歓迎です!

4

1 に答える 1

5

変換する特定の正規表現の場合、ECMA正規表現に相当するものは次のとおりです。

/^(\d{3,4})[- ]?(\d{4})[- ]?(\d{4})[- ]?(\d{4})$/

この場合、\A(Perl正規表現の場合)は^(ECMA正規表現の場合)(文字列の先頭に一致)と同じ意味を持ち、(Perl正規表現の場合)は(ECMA正規表現の場合)(文字列の末尾に一致する)\Zと同じ意味になります$。マルチラインモードを有効にすると、ECMA正規表現^のとの意味が行の最初と最後に一致するように変わることに注意してください。$

ECMA正規表現はPerl正規表現のサブセットであるため、正規表現がPerl正規表現の排他的機能を使用している場合、ECMA正規表現に変換できない可能性があります。同じ構文であっても、正規表現の2つの方言間で構文がわずかに異なることを意味する場合があるため、ドキュメントを確認して使用法を比較することをお勧めします。

ECMA正規表現とPerl正規表現の類似点についてのみ説明します。似ていないが、コンバーチブルなものは、私の能力のほとんどに言及します。

ECMA正規表現には、Unicodeで動作する機能がありません。これにより、コードポイントを検索し、それらを文字クラスとして指定する必要があります。

Perl正規表現のドキュメントに従ってください:

  • 修飾子:
    • ECMA標準には、、のみiがあり、Perlと同じように動作します。gm
    • sdot-all修飾子は、2つの補完的な文字クラスを使用してECMA正規表現でシミュレートできます[\S\s][\D\d]
    • とにかくxpフラグのサポートはありません。
    • 残りの部分(プレフィックスとサフィックスの修飾子)をシミュレートする方法があるかどうかはわかりません。
  • メタ文字:
    • 特別な意味に解決されない非メタ文字で使用することについては少し疑問が\ありますが、必要のない場所から逃げなければ問題ありません。.ECMAでは、さらにいくつかの文字が除外されます。残りはECMA正規表現で同じように動作します(mフラグの^とへの影響も$)。
  • 数量詞:
    • 貪欲と怠惰な行動は同じでなければなりません。ECMA正規表現には所有格はありません。
  • エスケープシーケンス:
    • ECMA正規表現には\aありません。、、、は同じです。\e\t\n\r\f
    • 正規表現に違いがある場合は、ドキュメントを確認してください\cX。違いがあります。
    • \xhhECMA正規表現とPerl正規表現で一般的です(2桁の16進数を指定するのが最も安全です。それ以外の場合は、ドキュメントを調べて、16進数が2桁未満の場合に言語がどのように処理されるかを確認する必要があります)。
    • \uhhhhUnicode文字を指定するECMA正規表現専用機能です。Perlには、、、、などの文字を指定する他の排他的な方法があります。\x{}\N{}\o{}\000
    • \l、、、\uはPerl正規表現専用\Lです。\U
    • \Q引用されたセクションを手作業でエスケープすることでシミュレート\Eできます。
    • Perl正規表現の8進数エスケープ(3桁未満の8進数)は混乱を招く可能性があります。コンテキストを注意深く確認し、ドキュメントを読んだり、正規表現をテストして、エスケープされたシーケンスまたは逆参照のいずれかである可能性があるため、コンテキストで何が行われているのかを理解していることを確認してください。
  • キャラクタークラスとその他の特別なエスケープ:
    • \w、、、、、、は、 US-ASCIIを想定している場合\W、ECMA正規表現とPerl正規表現で同等です\s。Unicodeが関係している場合、物事は血まみれの混乱になります。\S\d\D
    • ECMA正規表現にPOSIX文字クラスがありません。上記の、、を使用する\w\s\d文字クラスで自分自身を指定します。
    • 後方参照はほとんど同じですが、PerlとECMA正規表現の両方で後方参照が9を超えることができるかどうかはわかりません。
    • 名前付き参照は、後方参照を使用してシミュレートできます。
    • 残り(およびすでに述べたエスケープされたシーケンスを除く[])は、ECMA正規表現ではサポートされていません。
  • アサーション:
    • \b\Bに基づいて定義される方法に関しては、両方の言語で同等\wです。
  • キャプチャグループ:グループ化()と後方参照は同じです。$n一致したテキストへの逆参照を置換文字列で使用する、は同じです。このセクションの残りの部分は、Perl専用の機能です。
  • メタ文字の引用:(前のセクションですでに説明した内容)。
  • 拡張パターン:
    • ECMA正規表現は、正規表現内のフラグの変更をサポートしていません。フラグが何であるかによっては、正規表現を書き換えることができる場合があります(sフラグは、ECMA正規表現で常に同等の式に変換できるものです)。
    • PerlとECMAの間で共通しているのは(?:pattern)、(非キャプチャグループ)、(?=pattern)(ポジティブルックアヘッド)、 (ネガティブルックアヘッド)のみです。(?!pattern)
    • ECMA正規表現にはコメントがないため、(?#text)無視してかまいません。
    • 後読みはECMA正規表現ではサポートされていません。固定幅の後読みはPerlでサポートされています。場合によっては、Perlで記述されたポジティブルックビハインドの正規表現は、ルックビハインドキャプチャグループを作成することにより、ECMA正規表現に変換できます。
    • 前述のように、名前付きパターンは通常のキャプチャグループに変換でき、番号付きの後方参照で参照できます。
    • 残りはPerl独自の機能です。
  • 特別なバックトラッキング制御動詞:これはPerl専用であり、変換は言うまでもなく、これらが何をするのか(これまで触れたことはありません)わかりません。とにかくコンバーチブルではない可能性が高いです。

結論

正規表現がPerl正規表現の全機能を利用している場合、またはBoostライブラリがサポートするレベル(再帰正規表現など)の場合、正規表現をECMA正規表現に変換することはできません。幸い、ECMA正規表現は最も一般的に使用される機能をカバーしているため、正規表現は変換可能である可能性があります。

参照

MDNに関するECMA正規表現リファレンス

于 2012-08-26T03:59:00.577 に答える