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