19


12

Perlの正規表現を.NETに翻訳する

Perlにはいくつかの便利なhttp://en.wikipedia.org/wiki/Regular_expression [正規表現]があります。 それらを.NETの正規表現の方言に変換する簡単な方法はありますか?

そうでない場合、違いの簡潔な参照はありますか?

3 Answer


32


'' '' '

基本的な要素のほとんどは同じですが、違いは次のとおりです。

わずかな違い:

  • Unicodeエスケープシーケンス。 .NETでは \ u200A`で、Perlでは `\ x {200A}

  • .NETの `\ v`は単なる垂直タブ(U + 000B)です。Perlでは、 「垂直空白」クラス。 もちろん、Perlには `\ V`があります。

  • .NETの名前付き参照の条件式は `(?(name)yes | no)`ですが、Perlでは `(?()yes | no)`です。

一部の要素はPerlのみです:

  • 所有量指定子( x?+x * +x ++`など)。 バックトラッキングを使用しない 代わりに部分式( `(?>…))。

  • 名前付きユニコードエスケープシーケンス \ N {LATIN SMALL LETTER X}\ N {U + 200A}

  • ケースの折りたたみと脱出

  • \ l(小文字の次の文字)、` \ u`(大文字の次の文字)。

  • \ L(小文字)、` \ U`(大文字)、 \ Q(引用メタ文字) `\ E`まで。

  • Unicodeプロパティ \ pL`および \ PL`の略記法。 必ず .NETに中括弧を含めます。 \ p {L}

  • \ X、` \ C`のような奇妙なもの。

  • 「\ v」、「\ V」、「\ h」、「\ H」、「\ N」、「\ R」などの特殊文字クラス

  • 特定または以前のグループ \ g1、` \ g {-1} `への後方参照。 あなたはできる .NETでは絶対グループインデックスのみを使用します。

  • 名前付き後方参照 \ g {name}。 代わりに `\ k`を使用してください。

  • POSIX文字クラス [[:alpha:]]

  • ブランチリセットパターン (?|…)

  • \ K。 代わりに後読み( (?⇐…))を使用してください。

  • コード評価アサーション (?{…})、延期された部分式 (?? {…})

  • 部分式参照(再帰パターン) (?0)(?R)(?1)(?-1)(?+ 1)(?&name)

  • 一部の条件式の述語はPerl固有です:

  • コード (?{…})

  • 再帰的な (R)(R1)(R&name)

  • `(DEFINE)`を定義します。

  • 特別なバックトラッキング制御動詞 (* VERB:ARG)

  • Python構文

  • (?P…)。 代わりに `(?…)`を使用してください。

  • (?P = name)。 代わりに `\ k`を使用してください。

  • (?P> name)。 .NETには同等のものはありません。

一部の要素は.NETのみです:

  • 可変長の後読み。 Perlでは、ポジティブな後読みのために、 代わりに \ K

  • 条件式の任意の正規表現 (?(パターン)yes | no)

  • 文字クラスの減算(文書化されていない?) [a-z- [d-w]]

  • バランシンググループ (?←name>…)。 これはコードでシミュレートできます 評価アサーション `(?{…})`の後に `(?&name)`が続きます。

参考文献:


2


これらは、Perl 5正規表現とhttp://msdn.microsoft.com/en-us/library/hs600312(VS.71).aspx [互換性があるように設計]でした。 そのため、Perl 5の正規表現は_should_だけで.NETで機能します。

次のようにいくつかの `RegexOptions`を翻訳できます:

[Flags]
public enum RegexOptions
{
  Compiled = 8,
  CultureInvariant = 0x200,
  ECMAScript = 0x100,
  ExplicitCapture = 4,
  IgnoreCase = 1,                 // i in Perl
  IgnorePatternWhitespace = 0x20, // x in Perl
  Multiline = 2,                  // m in Perl
  None = 0,
  RightToLeft = 0x40,
  Singleline = 0x10               // s in Perl
}

もう1つのヒントは、C#ですべてのエスケープ文字をエスケープする必要がないように、逐語的な文字列を使用することです。

string badOnTheEyesRx    = "\\d{4}/\\d{2}/\\d{2}";
string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}";


1


それは正規表現の複雑さに本当に依存します-多くのものはそのままで同じように動作します。

this .NET正規表現のチートシートを見て、オペレーターが期待どおりに動作するかどうかを確認してください。

RegEx方言間で自動的に翻訳するツールは知りません。