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

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

Если нет, есть ли краткая справка о различиях?

19
задан Peter Mortensen 11 October 2014 в 07:55
поделиться

3 ответа

В http://www.regular-expressions.info/refflavors.html есть большая сравнительная таблица.


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

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

  • Управляющие последовательности Unicode. В .NET это \ u200A , в Perl это \ x {200A} .
  • \ v в .NET - это просто вертикальная табуляция (U + 000B), в Perl это класс «вертикальных пробелов». Конечно, из-за этого в Perl есть \ V .
  • Условным выражением для именованной ссылки в .NET является (? (Имя) да | нет) , но (? (<Имя>) да | нет) в Perl.

Некоторые элементы доступны только для Perl:

  • Притяжательные кванторы ( x? + , x * + , x ++ и т. Д.). Вместо этого используйте подвыражение без возврата ( (?>…) ).
  • Именованная escape-последовательность Юникода \ N {СТРОЧНАЯ ЛАТИНСКАЯ БУКВА 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) , (? & Имя) .
  • Некоторые предикаты условных выражений специфичны для Perl:
    • код (? {…})
    • рекурсивный (R) , (R1) , (R & name)
    • определить (ОПРЕДЕЛЕНИЕ) .
  • Специальные управляющие глаголы с возвратом (* VERB: ARG)
  • Синтаксис Python
    • (? P <имя>…) . Вместо этого используйте (? <Имя>…) .
    • (? P = имя) . Используйте вместо него \ k .
    • (? P> имя) . Нет эквивалента в .NET.

Некоторые элементы являются только .NET:

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

Ссылки:

34
ответ дан 30 November 2019 в 03:28
поделиться

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

Взгляните на этот шпаргалку по регулярным выражениям .NET, чтобы узнать, делает ли оператор то, что вы от него ожидаете.

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

1
ответ дан 30 November 2019 в 03:28
поделиться

Они были разработаны для совместимости с регексами 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
}

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

string badOnTheEyesRx    = "\\d{4}/\\d{2}/\\d{2}";
string easierOnTheEyesRx = @"\d{4}/\d{2}/\d{2}";
3
ответ дан 30 November 2019 в 03:28
поделиться