如何在prolog中匹配给定reg表达式的字符串?

时间:2016-11-28 05:20:37

标签: regex prolog

我正在尝试匹配一个表达式,它与prolog中的正则表达式类似,用于给定的输入字符串。

match_function([_$]?[a-z]|[a-z][a-z_]*[a-z],"+ab_c").
false
match_function([_$]?[A-Z]|[A-Z][A-Z_]*[A-Z],"+AB_C").
...

任何指针如何处理这种情况? 。就像我如何分割第一个参数并使用模式匹配逐个检查字符串的每个元素?

之类的东西
match([_$],[X|Xs]):-
member(X,"_$").
     match_next(NEXT_ELMENT_IN_THE_STRING)...

1 个答案:

答案 0 :(得分:0)

如果这是您想要完成的工作,请使用现有的正则表达式库。您可以通过运行pack_install(regex)来安装SWI-Prolog。

如果由于某些其他原因需要/必须实现它,则应首先将正则表达式解析为更易于使用的表示形式,然后使用该表达式编写match谓词。 DCG应该对这两个部分都有用。

例如,[_$]?[a-z]|[a-z][a-z_]*[a-z]的正则表达式可以转换为

这样的术语
choice(sequence([option(one_of(['_', '$'])), range(a, z)]),
       sequence([range(a, z), any(one_of([range(a, z), '_']), range(a, z)]))

然后您可以使用

等规则匹配字符列表
match(one_of(Chars)) -->
    [C],
    { member(C, Chars) }.

如果你是一个完全的初学者,这并不容易,但我们很乐意帮助解决具体问题!