是Java和C#经常EX pressions兼容? [英] Are Java and C# regular expressions compatible?

查看:195
本文介绍了是Java和C#经常EX pressions兼容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这两种语言都声称自己使用Perl样式的正前pressions。如果我有一个语言测试一个普通的前pression的有效性,将其在其他工作?哪里常规EX pression语法有什么不同?

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

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

解决方案

有相当(大量的)区别。

字符类

  1. 字符类减法 [ABC- [CDE]]
    • 在.NET 是(2.0)
    • Java的:通过字符类交集和否定的仿真: [ABC和放大器;&放大器; [^ CDE]
  2. 字符类交集 [ABC和放大器;&放大器; CDE]]
    • .NET:通过字符类减法和否定的仿真: [ABC - [^ CDE]
    • 的Java
  3. \ p {字母} POSIX字符类
    • 在.NET
    • 的Java 是(US-ASCII)
  4. (?x)模式 <一个href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#COMMENTS"><$c$c>COMMENTS/<$c$c>IgnorePatternWhitespace,空间(U + 0020)字符类的显著的。
    • 在.NET中的
    • 的Java
  5. 统一code类别(L,M,N,P,S, Z,C)
    • 在.NET \ p {L〕表格只
    • 的Java
      • 从Java 5的: \ PL \ p {L〕 \ p {ISL}
      • 从Java 7中: \ p {general_category = L} \ p {GC = L}
  6. 统一code类别(鲁,LL,LT,...)
    • 在.NET \ p {鲁} 表格只
    • 的Java
      • 从Java 5的: \ p {鲁} \ p {IsLu}
      • 从Java 7中: \ p {general_category =鲁} \ p {GC =鲁}
  7. 统一code座
    • 在.NET \ p {IsBasicLatin} 只。 (<一href="http://msdn.microsoft.com/en-us/library/20bw873z%28v=vs.110%29.aspx#SupportedNamedBlocks">Supported命名块)
    • 的Java :(块的名称是自由套管)
      • 从Java 5的: \ p {InBasicLatin}
      • 从Java 7中: \ p {块= BasicLatin} \ p {BLK = BasicLatin}
  8. 空间,并在所有长块名称中使用下划线允许(如 BasicLatin 可以写成 BASIC_LATIN 基本拉丁语
    • 在.NET
    • 的Java (Java 5中)

量词

  1. + * + + {M,N} + (所有格量词)
    • 在.NET
    • 的Java

报价

  1. \ Q ...。\ E 逃脱元字符的字符串
    • 在.NET
    • 的Java
  2. \ Q ...。\ E 逃脱一个字符串的字符类的元字符(字符集)
    • 在.NET
    • 的Java

匹配构建

  1. 条件匹配的((=正则表达式),那么|?否则)((正则表达式),那么|?否则)((1),然后|?否则)((组),那么|?否则)
    • 在.NET中的
    • 的Java
  2. 命名捕获组和命名的反向引用
    • 在.NET中的
      • 捕获组:(?&LT;名称&gt;正则表达式)(?'name'regex)
      • 后向引用: \ K&LT;名称&gt; \ k'name
    • 的Java (<一href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group%28java.lang.String%29">Java 7 ):
      • 捕获组:(?&LT;名称&gt;正则表达式)
      • 后向引用: \ K&LT;名称&gt;
  3. 在多重捕获组可以有相同的名字
    • 在.NET中的
    • 的Java (Java 7中)
  4. 在平衡组定义(小于?名1名2&GT;正则表达式)(?'名1 - name2'subex pression)
    • 在.NET中的
    • 的Java

断言

  1. (?&LT; =文本)(正后向)
    • 在.NET中的可变宽度
    • 的Java 明显的宽度
  2. (?&LT;!文本)(负后向)
    • 在.NET中的可变宽度
    • 的Java 明显的宽度

模式选项/标志

  1. <一个href="http://msdn.microsoft.com/en-us/library/yd1hzczs%28v=vs.110%29.aspx"><$c$c>ExplicitCapture选择(?N)
    • 在.NET中的
    • 的Java

其他

  1. (?#评论)在线评论
    • 在.NET中的
    • 的Java

参考

Both languages claim to use Perl style regular expressions. If I have one language test a regular expression for validity, will it work in the other? Where do the regular expression syntaxes differ?

The use case here is a C# (.NET) UI talking to an eventual Java back end implementation that will use the regex to match data.

Note that I only need to worry about matching, not about extracting portions of the matched data.

解决方案

There are quite (a lot of) differences.

Character Class

  1. Character classes subtraction [abc-[cde]]
    • .NET YES (2.0)
    • Java: Emulated via character class intersection and negation: [abc&&[^cde]])
  2. Character classes intersection [abc&&[cde]]
    • .NET: Emulated via character class subtraction and negation: [abc-[^cde]])
    • Java YES
  3. \p{Alpha} POSIX character class
    • .NET NO
    • Java YES (US-ASCII)
  4. Under (?x) mode COMMENTS/IgnorePatternWhitespace, space (U+0020) in character class is significant.
    • .NET YES
    • Java NO
  5. Unicode Category (L, M, N, P, S, Z, C)
    • .NET YES: \p{L} form only
    • Java YES:
      • From Java 5: \pL, \p{L}, \p{IsL}
      • From Java 7: \p{general_category=L}, \p{gc=L}
  6. Unicode Category (Lu, Ll, Lt, ...)
    • .NET YES: \p{Lu} form only
    • Java YES:
      • From Java 5: \p{Lu}, \p{IsLu}
      • From Java 7: \p{general_category=Lu}, \p{gc=Lu}
  7. Unicode Block
    • .NET YES: \p{IsBasicLatin} only. (Supported Named Blocks)
    • Java YES: (name of the block is free-casing)
      • From Java 5: \p{InBasicLatin}
      • From Java 7: \p{block=BasicLatin}, \p{blk=BasicLatin}
  8. Spaces, and underscores allowed in all long block names (e.g. BasicLatin can be written as Basic_Latin or Basic Latin)
    • .NET NO
    • Java YES (Java 5)

Quantifier

  1. ?+, *+, ++ and {m,n}+ (possessive quantifiers)
    • .NET NO
    • Java YES

Quotation

  1. \Q...\E escapes a string of metacharacters
    • .NET NO
    • Java YES
  2. \Q...\E escapes a string of character class metacharacters (in character sets)
    • .NET NO
    • Java YES

Matching construct

  1. Conditional matching (?(?=regex)then|else), (?(regex)then|else), (?(1)then|else) or (?(group)then|else)
    • .NET YES
    • Java NO
  2. Named capturing group and named backreference
    • .NET YES:
      • Capturing group: (?<name>regex) or (?'name'regex)
      • Backreference: \k<name> or \k'name'
    • Java YES (Java 7):
      • Capturing group: (?<name>regex)
      • Backreference: \k<name>
  3. Multiple capturing groups can have the same name
    • .NET YES
    • Java NO (Java 7)
  4. Balancing group definition (?<name1-name2>regex) or (?'name1-name2'subexpression)
    • .NET YES
    • Java NO

Assertions

  1. (?<=text) (positive lookbehind)
    • .NET Variable-width
    • Java Obvious width
  2. (?<!text) (negative lookbehind)
    • .NET Variable-width
    • Java Obvious width

Mode Options/Flags

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

Miscellaneous

  1. (?#comment) inline comments
    • .NET YES
    • Java NO

References

这篇关于是Java和C#经常EX pressions兼容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆