是Java和C#经常EX pressions兼容? [英] Are Java and C# regular expressions compatible?
本文介绍了是Java和C#经常EX pressions兼容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这两种语言都声称自己使用Perl样式的正前pressions。如果我有一个语言测试一个普通的前pression的有效性,将其在其他工作?哪里常规EX pression语法有什么不同?
用例这里是一个C#(.NET)UI谈论最终的Java后端实现,将使用正则表达式匹配的数据。
请注意,我只需要担心的匹配,而不是有关提取匹配的数据部分。
解决方案
有相当(大量的)区别。
字符类
- 字符类减法
[ABC- [CDE]]
- 在.NET 是(2.0)
- Java的:通过字符类交集和否定的仿真:
[ABC和放大器;&放大器; [^ CDE]
)
- 字符类交集
[ABC和放大器;&放大器; CDE]]
- .NET:通过字符类减法和否定的仿真:
[ABC - [^ CDE]
) - 的Java 是
- .NET:通过字符类减法和否定的仿真:
-
\ p {字母}
POSIX字符类- 在.NET 否
- 的Java 是(US-ASCII)
- 在
(?x)
模式 <一个href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#COMMENTS"><$c$c>COMMENTS$c$c>/<$c$c>IgnorePatternWhitespace$c$c>,空间(U + 0020)字符类的显著的。- 在.NET中的是
- 的Java 否
- 统一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}
- 从Java 5的:
- 在.NET 是:
- 统一code类别(鲁,LL,LT,...)
- 在.NET 是:
\ p {鲁}
表格只 - 的Java 是:
- 从Java 5的:
\ p {鲁}
,\ p {IsLu}
- 从Java 7中:
\ p {general_category =鲁}
,\ p {GC =鲁}
- 从Java 5的:
- 在.NET 是:
- 统一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}
- 从Java 5的:
- 在.NET 是:
- 空间,并在所有长块名称中使用下划线允许(如
BasicLatin
可以写成BASIC_LATIN
或基本拉丁语
)- 在.NET 否
- 的Java 是(Java 5中)
量词
-
+
,* +
,+
和{M,N} +
(所有格量词)- 在.NET 否
- 的Java 是
报价
-
\ Q ...。\ E
逃脱元字符的字符串- 在.NET 否
- 的Java 是
-
\ Q ...。\ E
逃脱一个字符串的字符类的元字符(字符集)- 在.NET 否
- 的Java 是
匹配构建
- 条件匹配的
((=正则表达式),那么|?否则)
,((正则表达式),那么|?否则)
,((1),然后|?否则)
或((组),那么|?否则)
- 在.NET中的是
- 的Java 否
- 命名捕获组和命名的反向引用
- 在.NET中的是:
- 捕获组:(?&LT;名称&gt;正则表达式)(?'name'regex)
- 后向引用:
\ K&LT;名称&gt;
或\ k'name
- 捕获组:(?&LT;名称&gt;正则表达式)(?'name'regex)
- 的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;
- 捕获组:(?&LT;名称&gt;正则表达式)
- 在.NET中的是:
- 在多重捕获组可以有相同的名字
- 在.NET中的是
- 的Java 否(Java 7中)
- 在平衡组定义
(小于?名1名2&GT;正则表达式)(?'名1 - name2'subex pression)
或- 在.NET中的是
- 的Java 否
断言
-
(?&LT; =文本)
(正后向)- 在.NET中的可变宽度
- 的Java 明显的宽度
-
(?&LT;!文本)
(负后向)- 在.NET中的可变宽度
- 的Java 明显的宽度
模式选项/标志
- <一个href="http://msdn.microsoft.com/en-us/library/yd1hzczs%28v=vs.110%29.aspx"><$c$c>ExplicitCapture$c$c>选择
(?N)
- 在.NET中的是
- 的Java 否
其他
-
(?#评论)
在线评论- 在.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
- Character classes subtraction
[abc-[cde]]
- .NET YES (2.0)
- Java: Emulated via character class intersection and negation:
[abc&&[^cde]]
)
- Character classes intersection
[abc&&[cde]]
- .NET: Emulated via character class subtraction and negation:
[abc-[^cde]]
) - Java YES
- .NET: Emulated via character class subtraction and negation:
\p{Alpha}
POSIX character class- .NET NO
- Java YES (US-ASCII)
- Under
(?x)
modeCOMMENTS
/IgnorePatternWhitespace
, space (U+0020) in character class is significant.- .NET YES
- Java NO
- 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}
- From Java 5:
- .NET YES:
- 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}
- From Java 5:
- .NET YES:
- 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}
- From Java 5:
- .NET YES:
- Spaces, and underscores allowed in all long block names (e.g.
BasicLatin
can be written asBasic_Latin
orBasic Latin
)- .NET NO
- Java YES (Java 5)
Quantifier
?+
,*+
,++
and{m,n}+
(possessive quantifiers)- .NET NO
- Java YES
Quotation
\Q...\E
escapes a string of metacharacters- .NET NO
- Java YES
\Q...\E
escapes a string of character class metacharacters (in character sets)- .NET NO
- Java YES
Matching construct
- Conditional matching
(?(?=regex)then|else)
,(?(regex)then|else)
,(?(1)then|else)
or(?(group)then|else)
- .NET YES
- Java NO
- Named capturing group and named backreference
- .NET YES:
- Capturing group:
(?<name>regex)
or(?'name'regex)
- Backreference:
\k<name>
or\k'name'
- Capturing group:
- Java YES (Java 7):
- Capturing group:
(?<name>regex)
- Backreference:
\k<name>
- Capturing group:
- .NET YES:
- Multiple capturing groups can have the same name
- .NET YES
- Java NO (Java 7)
- Balancing group definition
(?<name1-name2>regex)
or(?'name1-name2'subexpression)
- .NET YES
- Java NO
Assertions
(?<=text)
(positive lookbehind)- .NET Variable-width
- Java Obvious width
(?<!text)
(negative lookbehind)- .NET Variable-width
- Java Obvious width
Mode Options/Flags
ExplicitCapture
option(?n)
- .NET YES
- Java NO
Miscellaneous
(?#comment)
inline comments- .NET YES
- Java NO
References
- regular-expressions.info - Comparison of Different Regex Flavors
- MSDN Library Reference - .NET Framework 4.5 - Regular Expression Language
- Pattern (Java Platform SE 7)
这篇关于是Java和C#经常EX pressions兼容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文