У меня есть несколько полезных регулярных выражений в 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.