两种语言都声称使用Perl样式的正则表达式.如果我有一种语言测试正则表达式的有效性,它会在另一种语言中工作吗?正则表达式语法在哪里不同?
这里的用例是一个C#(.NET)UI,它与最终的Java后端实现进行通信,该实现将使用正则表达式来匹配数据.
请注意,我只需要担心匹配,而不是提取匹配数据的部分.
有很多(很多)差异.
字符类减法 [abc-[cde]]
.NET YES(2.0)
Java的:通过字符类交集和否定仿真的:[abc&&[^cde]]
)
字符类交集 [abc&&[cde]]
.NET:通过字符类减法和否定的仿:[abc-[^cde]]
)
Java 是的
\p{Alpha}
POSIX字符类
.NET NO
Java YES(US-ASCII)
在(?x)
mode COMMENTS
/下IgnorePatternWhitespace
,字符类中的空格(U + 0020)很重要.
.NET YES
Java NO
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}
Unicode类别(Lu,Ll,Lt,...)
.NET YES:\p{Lu}
仅限表单
Java 是:
从Java 5 \p{Lu}
,\p{IsLu}
从Java 7 \p{general_category=Lu}
,\p{gc=Lu}
Unicode块
.NET YES:\p{IsBasicLatin}
仅限.(支持的命名块)
Java YES :(块的名称是free-casing)
从Java 5开始: \p{InBasicLatin}
从Java 7 \p{block=BasicLatin}
,\p{blk=BasicLatin}
所有长块名称中允许的空格和下划线(例如,BasicLatin
可以写为Basic_Latin
或Basic Latin
)
.NET NO
Java YES(Java 5)
?+
,*+
,++
和{m,n}+
(所有格量词)
.NET NO
Java 是的
\Q...\E
转义一串元字符
.NET NO
Java 是的
\Q...\E
转义一串字符类元字符(在字符集中)
.NET NO
Java 是的
有条件的匹配(?(?=regex)then|else)
,(?(regex)then|else)
,(?(1)then|else)
或者(?(group)then|else)
.NET YES
Java NO
命名捕获组并命名为反向引用
.NET YES:
捕获组:(?
或(?'name'regex)
反向引用:\k
或\k'name'
Java YES(Java 7):
捕获组: (?
反向引用: \k
多个捕获组可以具有相同的名称
.NET YES
Java NO(Java 7)
平衡组定义(?
或(?'name1-name2'subexpression)
.NET YES
Java NO
(?<=text)
(正面看后面)
.NET 可变宽度
Java 明显的宽度
.NET 可变宽度 Java 明显的宽度(? (负面的背后)
ExplicitCapture
选项 (?n)
.NET YES
Java NO
(?#comment)
内联评论
.NET YES
Java NO
regular-expressions.info - 不同正则表达口味的比较
MSDN Library Reference - .NET Framework 4.5 - 正则表达式语言
模式(Java Platform SE 7)
查看:http://www.regular-expressions.info/refflavors.html 该站点上有大量的正则表达式信息,并且有一个很好的图表,详细说明了java和.net之间的区别.