Java和C#正则表达式是否兼容?

TRE*_*REE 43 .net c# java regex

两种语言都声称使用Perl样式的正则表达式.如果我有一种语言测试正则表达式的有效性,它会在另一种语言中工作吗?正则表达式语法在哪里不同?

这里的用例是一个C#(.NET)UI,它与最终的Java后端实现进行通信,该实现将使用正则表达式来匹配数据.

请注意,我只需要担心匹配,而不是提取匹配数据的部分.

Dre*_*kes 94

有很多(很多)差异.

角色类

  1. 字符类减法 [abc-[cde]]
    • .NET YES(2.0)
    • Java的:通过字符类交集和否定仿真的:[abc&&[^cde]])
  2. 字符类交集 [abc&&[cde]]
    • .NET:通过字符类减法和否定的仿:[abc-[^cde]])
    • Java 是的
  3. \p{Alpha} POSIX字符类
    • .NET NO
    • Java YES(US-ASCII)
  4. (?x)mode COMMENTS/下IgnorePatternWhitespace,字符类中的空格(U + 0020)很重要.
    • .NET YES
    • Java NO
  5. Unicode类别(L,M,N,P,S,Z,C)
    • .NET YES:\p{L}仅限表单
    • Java :
      • 从Java 5: ,,\pL\p{L}\p{IsL}
      • 从Java 7 \p{general_category=L},\p{gc=L}
  6. Unicode类别(Lu,Ll,Lt,...)
    • .NET YES:\p{Lu}仅限表单
    • Java :
      • 从Java 5 \p{Lu},\p{IsLu}
      • 从Java 7 \p{general_category=Lu},\p{gc=Lu}
  7. Unicode块
    • .NET YES:\p{IsBasicLatin}仅限.(支持的命名块)
    • Java YES :(块的名称是free-casing)
      • 从Java 5开始: \p{InBasicLatin}
      • 从Java 7 \p{block=BasicLatin},\p{blk=BasicLatin}
  8. 所有长块名称中允许的空格和下划线(例如,BasicLatin可以写为Basic_LatinBasic Latin)
    • .NET NO
    • Java YES(Java 5)

量词

  1. ?+,*+,++{m,n}+(所有格量词)
    • .NET NO
    • Java 是的

行情

  1. \Q...\E 转义一串元字符
    • .NET NO
    • Java 是的
  2. \Q...\E 转义一串字符类元字符(在字符集中)
    • .NET NO
    • Java 是的

匹配构造

  1. 有条件的匹配(?(?=regex)then|else),(?(regex)then|else),(?(1)then|else)或者(?(group)then|else)
    • .NET YES
    • Java NO
  2. 命名捕获组并命名为反向引用
    • .NET YES:
      • 捕获组:(?<name>regex)(?'name'regex)
      • 反向引用:\k<name>\k'name'
    • Java YES(Java 7):
      • 捕获组: (?<name>regex)
      • 反向引用: \k<name>
  3. 多个捕获组可以具有相同的名称
    • .NET YES
    • Java NO(Java 7)
  4. 平衡组定义(?<name1-name2>regex)(?'name1-name2'subexpression)
    • .NET YES
    • Java NO

断言

  1. (?<=text) (正面看后面)
    • .NET 可变宽度
    • Java 明显的宽度
  2. (?<!text) (负面的背后)
    • .NET 可变宽度
    • Java 明显的宽度

模式选项/标志

  1. ExplicitCapture 选项 (?n)
    • .NET YES
    • Java NO

  1. (?#comment) 内联评论
    • .NET YES
    • Java NO

参考

  • 这更加努力.;) (4认同)

Set*_*eth 6

查看:http://www.regular-expressions.info/refflavors.html 该站点上有大量的正则表达式信息,并且有一个很好的图表,详细说明了java和.net之间的区别.