У меня есть несколько полезных регулярных выражений в Perl. Есть ли простой способ перевести их на .NET-диалект регулярных выражений?
Если нет, есть ли краткая ссылка различий?
У меня есть несколько полезных регулярных выражений в Perl. Есть ли простой способ перевести их на .NET-диалект регулярных выражений?
Если нет, есть ли краткая ссылка различий?
В таблице http://www.regular-expressions.info/refflavors.html.
Большинство основных элементов одинаковы, различия заключаются в следующем:
Незначительные отличия:
\u200A, в Perl это \x{200A}.\v в .NET - это только вертикальная вкладка (U + 000B), в Perl она обозначает класс "вертикальные пробелы". Из-за этого, конечно, есть \v в Perl.(?(name)yes|no), но (?(<name>)yes|no) в Perl.Некоторые элементы Perl-only:
x?+, x*+, x++ и т.д.). Вместо этого используйте подвыражение без обратного отслеживания ((?>…)).\N{LATIN SMALL LETTER X}, \N{U+200A}.\l (нижний регистр следующий char), \u (верхний регистр следующий char).\l (нижний регистр), \u (верхний регистр), \Q (цитаты метасимволов) до \E.\pL и \pL. Вы должны включить фигурные скобки в .NET, например. \p{L}.\X, \C.\v, \v, \h, \h, \N, \R\g1, \g{-1}. Вы можете использовать абсолютный индекс группы в .NET.\g{name}. Вместо этого используйте \k<name>.[[:alpha:]].(?|…)\K. Вместо этого используйте look-behind ((?<=…)).(?{…}), послепоказанное подвыражение (??{…}).(?0), (?R), (?1), (?-1), (?+1), (?&name).(?{…})(R), (R1), (R&name)(DEFINE).(*VERB:ARG)(?P<name>…). Вместо этого используйте (?<name>…).(?P=name). Вместо этого используйте \k<name>.(?P>name). Нет эквивалента в .NET.Некоторые элементы только .NET:
\K вместо этого.(?(pattern)yes|no).[a-z-[d-w]](?<-name>…). Это может быть смоделировано с утверждением оценки кода (?{…}), за которым следует (?&name).Литература:
Они были предназначены для совместимости с регулярными выражениями 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}";
Это действительно зависит от сложности регулярного выражения - многие из них будут работать одинаково.
Взгляните на this Чит-лист .NET regex, чтобы узнать, выполняет ли оператор то, что вы ожидаете от него.
Я не знаю ни одного инструмента, который автоматически переводит между диалоги RegEx.