簡體   English   中英

將Perl正則表達式轉換為.NET

[英]Translate Perl regular expressions to .NET

我在Perl中有一些有用的正則表達式 是否有一種簡單的方法可以將它們轉換為.NET的正則表達式方言?

如果沒有,是否有簡要的差異參考?

http://www.regular-expressions.info/refflavors.html中有一個很大的比較表。


大多數基本元素相同,區別在於:

細微差異:

  • Unicode轉義序列。 在.NET中,它是\  ,在Perl中是\\x{200A}
  • .NET中的\\v只是垂直制表符(U + 000B),在Perl中代表“垂直空格”類。 因此,Perl中有\\V
  • .NET中命名引用的條件表達式為(?(name)yes|no) ,但在Perl中為(?(<name>)yes|no)

一些元素僅適用於Perl:

  • 所有格量詞( x?+x*+x++等)。 改用非回溯子表達式( (?>…) )。
  • 命名為unicode轉義序列\\N{LATIN SMALL LETTER X}\\N{U+200A}
  • 案件折疊和逃脫
    • \\l (小寫的下一個字符), \\u\u003c/code> (大寫的下一個字符)。
    • \\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<name>
  • POSIX字符類[[:alpha:]]
  • 分支重置模式(?|…)
  • \\K 使用后向( (?<=…) )代替。
  • 代碼評估斷言(?{…}) ,延遲子表達式(??{…})
  • 子表達式參考(遞歸模式) (?0)(?R)(?1)(?-1)(?+1)(?&name)
  • 一些條件表達式的謂詞是Perl特定的:
    • 代碼(?{…})
    • 遞歸(R)(R1)(R&name)
    • 定義(DEFINE)
  • 特殊的回溯控制動詞(*VERB:ARG)
  • Python語法
    • (?P<name>…) 使用(?<name>…)代替。
    • (?P=name) 請改用\\k<name>
    • (?P>name) .NET中沒有等效項。

某些元素僅是.NET:

  • 可變長度后向。 在Perl中,要獲得積極的后視效果,請改用\\K
  • 條件表達式中的任意正則表達式(?(pattern)yes|no)
  • 字符類減法(未記錄?) [az-[dw]]
  • 平衡組(?<-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
}

另一個技巧是使用逐字字符串,這樣您就無需在C#中轉義所有這些轉義字符:

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

它實際上取決於正則表達式的復雜性-許多表達式可以立即使用。

看看 .NET regex備忘單,看看操作員是否按照您的期望去做。

我不知道能在RegEx方言之間自動翻譯的任何工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM