2017-02-28 26 views
2

我一起Text.Regex.PCRE,在我的情况下,使用正则表达式哈斯克尔我:Haskell和正则表达式与交叉口

Prelude Text.Regex.PCRE> getAllTextMatches ("32UMU1078" =~ "(\\d{1,2})([C-X&&[^IO]])([A-Z&&[^IO]])([A-Z&&[^IO]])(\\d{2,10})" :: AllTextMatches [] String) 
[] 

我期待一些值返回,但列表为空。然而,这返回的期望是什么:

Prelude Text.Regex.PCRE> getAllTextMatches ("32UMU1078" =~ "(\\d{1,2})([C-X])([A-Z])([A-Z])(\\d{2,10})" :: AllTextMatches [] String) 
["32UMU1078"] 

所以,如果我删除喜欢&&[^IO]交点不存在任何问题。 正如我刚刚发现PCRE不支持交叉点。任何支持Haskell的替代库?

+0

编号PCRE不支持任何种类的字符类操作,如交叉点。 – revo

+0

我在一些地方读过它。不好的来源:)但是我改变了一些问题。谢谢 – Randomize

回答

2

PCRE不支持字符类相交/减法。

但是,您可以使用负向预览和其他方法解决此问题。 >(?![IO])[C-X] -

这里,向前看符号,[C-X&&[^IO]]

"(\\d{1,2})((?![IO])[C-X])((?![IO])[A-Z])((?![IO])[A-Z])(\\d{2,10})" 
      ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ 

也就是说更换"(\\d{1,2})([C-X&&[^IO]])([A-Z&&[^IO]])([A-Z&&[^IO]])(\\d{2,10})",更换减法。

另一种方式,那就是更详细的,是拼出来的字符类:

"(\\d{1,2})([C-HJ-NP-X])([A-HJ-NP-Z])([A-HJ-NP-Z])(\\d{2,10})" 

所以,[C-X]不匹配IO必须写成[C-HJ-NP-X]

+0

谢谢。 Perl的前瞻性工作正常。 – Randomize