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

2022-09-01 00:21:20

这两种语言都声称使用Perl风格的正则表达式。如果我让一种语言测试正则表达式的有效性,它会在另一种语言中起作用吗?正则表达式语法有何不同?

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

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


答案 1

有相当多的(很多)差异。

字符类

  1. 字符类减法[abc-[cde]]
    • .NET 是 (2.0)
    • Java:通过字符类交集和否定进行模拟:[abc&&[^cde]])
  2. 字符类交集[abc&&[cde]]
    • .NET:通过字符类减法和否定进行模拟:[abc-[^cde]])
    • Java YES
  3. \p{Alpha}POSIX 字符类
    • .净
    • Java YES (US-ASCII)
  4. 在模式 COMMENTS/IgnorePatternWhitespace 模式下,字符类中的空格 (U+0020) 很重要(?x)
    • .NET
    • Java NO
  5. Unicode Category (L, M, N, P, S, Z, C)
    • .NET :仅表单\p{L}
    • Java YES
      • 从 Java 5: , ,\pL\p{L}\p{IsL}
      • 从 Java 7 开始:,\p{general_category=L}\p{gc=L}
  6. Unicode Category (Lu, Ll, Lt, ...)
    • .NET :仅表单\p{Lu}
    • Java YES
      • 从 Java 5 开始:,\p{Lu}\p{IsLu}
      • 从 Java 7 开始:,\p{general_category=Lu}\p{gc=Lu}
  7. 统一码块
    • .NET 是的:仅限。(支持的命名块\p{IsBasicLatin})
    • Java YES:(块的名称是自由大小写)
      • 从 Java 5:\p{InBasicLatin}
      • 从 Java 7 开始:,\p{block=BasicLatin}\p{blk=BasicLatin}
  8. 所有长块名称中都允许使用空格和下划线(例如 可以写成 或BasicLatinBasic_LatinBasic Latin)
    • .净
    • Java YES (Java 5)

量词

  1. ?+、和(所有格量词)*+++{m,n}+
    • .净
    • Java YES

报价单

  1. \Q...\E转义元字符字符串
    • .净
    • Java YES
  2. \Q...\E转义字符类元字符的字符串(以字符集为单位)
    • .净
    • Java YES

匹配构造

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

断言

  1. (?<=text)(正面看)
    • .NET 可变宽度
    • 爪哇明显宽度
  2. (?<!text)(负面看)
    • .NET 可变宽度
    • 爪哇明显宽度

模式选项/标志

  1. 显式捕获选项(?n)
    • .NET
    • Java NO

杂项

  1. (?#comment)内联注释
    • .NET
    • Java NO

引用


答案 2

查看:http://www.regular-expressions.info/refflavors.html 该站点上有很多正则表达式信息,并且有一个很好的图表,详细介绍了java和.net之间的差异。