Перевести регулярные выражения Perl на .NET.

У меня есть несколько полезных регулярных выражений в Perl. Есть ли простой способ перевести их на .NET-диалект регулярных выражений?

Если нет, есть ли краткая ссылка различий?

Ответ 1

В таблице http://www.regular-expressions.info/refflavors.html.


Большинство основных элементов одинаковы, различия заключаются в следующем:

Незначительные отличия:

  • Unicode escape-последовательности. В .NET это \u200A, в Perl это \x{200A}.
  • \v в .NET - это только вертикальная вкладка (U + 000B), в Perl она обозначает класс "вертикальные пробелы". Из-за этого, конечно, есть \v в Perl.
  • Условное выражение для именованной ссылки в .NET равно (?(name)yes|no), но (?(<name>)yes|no) в Perl.

Некоторые элементы Perl-only:

  • Потенциальные кванторы (x?+, x*+, x++ и т.д.). Вместо этого используйте подвыражение без обратного отслеживания ((?>…)).
  • Именованная последовательность удаления unicode \N{LATIN SMALL LETTER X}, \N{U+200A}.
  • Складывание и уход
    • \l (нижний регистр следующий char), \u (верхний регистр следующий char).
    • \l (нижний регистр), \u (верхний регистр), \Q (цитаты метасимволов) до \E.
  • Сокращенное обозначение для свойства Unicode \pL и \pL. Вы должны включить фигурные скобки в .NET, например. \p{L}.
  • Нечетные вещи, например \X, \C.
  • Специальные классы символов, такие как \v, \v, \h, \h, \N, \R
  • Обратная ссылка на конкретную или предыдущую группу \g1, \g{-1}. Вы можете использовать абсолютный индекс группы в .NET.
  • Именованный backreference \g{name}. Вместо этого используйте \k<name>.
  • Класс символов POSIX [[:alpha:]].
  • Филиал < reset (?|…)
  • \K. Вместо этого используйте look-behind ((?<=…)).
  • Утверждение оценки кода (?{…}), послепоказанное подвыражение (??{…}).
  • Ссылка на подвыражение (рекурсивный рисунок) (?0), (?R), (?1), (?-1), (?+1), (?&name).
  • Некоторые предикаты условного выражения зависят от Perl:
    • code (?{…})
    • рекурсивный (R), (R1), (R&name)
    • define (DEFINE).
  • Специальные глаголы управления Backtracking (*VERB:ARG)
  • Синтаксис Python
    • (?P<name>…). Вместо этого используйте (?<name>…).
    • (?P=name). Вместо этого используйте \k<name>.
    • (?P>name). Нет эквивалента в .NET.

Некоторые элементы только .NET:

  • Переменная длина. В Perl для позитивного поиска используйте \K вместо этого.
  • Произвольное регулярное выражение в условном выражении (?(pattern)yes|no).
  • Вычитание класса символов (недокументированное?) [a-z-[d-w]]
  • Балансирующая группа (?<-name>…). Это может быть смоделировано с утверждением оценки кода (?{…}), за которым следует (?&name).

Литература:

Ответ 2

Они были предназначены для совместимости с регулярными выражениями Perl 5. Таким образом, регулярные выражения Perl 5 должны работать только в .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
}

Еще один совет: использовать стенографические строки, чтобы вам не нужно было удалять все эти escape-символы в С#:

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

Ответ 3

Это действительно зависит от сложности регулярного выражения - многие из них будут работать одинаково.

Взгляните на this Чит-лист .NET regex, чтобы узнать, выполняет ли оператор то, что вы ожидаете от него.

Я не знаю ни одного инструмента, который автоматически переводит между диалоги RegEx.