正则表达式匹配

 1 package algorithms;
 2 
 3 /**
 4  * 请实现一个函数用来匹配包括'.'和'*'的正则表达式。 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
 5  * 在本题中,匹配是指字符串的所有字符匹配整个模式。 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
 6  * 
 7  * 
 8  **/
 9 
10 public class StringMatch {
11     public boolean match(char[] str, char[] pattern) {
12         return matchCore(str, 0, pattern, 0);
13     }
14 
15     public boolean matchCore(char[] str, int i, char[] pattern, int j) {
16         if (i >= str.length && j >= pattern.length) {
17             return true;
18         }
19         if (i != str.length - 1 && j == pattern.length - 1)
20             return false;
21         // 一种较为复杂的情况 即模式的字符后面一个字符为*
22         if (j < pattern.length - 1 && pattern[j + 1] == '*') {
23             // 如果两者当前能够匹配上 模式有两种选择
24             // 一是向后移动两个字符 二是原地不动
25             // 如果当成匹配上字符串也需要向后移动一个字符
26             if (i < str.length && (pattern[j] == str[i] || (pattern[j] == '.' && i < str.length))) {
27                 return matchCore(str, i + 1, pattern, j + 2) || matchCore(str, i + 1, pattern, j)
28                         || matchCore(str, i, pattern, j + 2);
29             } else
30                 return matchCore(str, i, pattern, j + 2);
31 
32         }
33         // 如果模式的字符后一个不是*时,该情况较为简单 直接比较即可
34         if (i < str.length && j < pattern.length && (str[i] == pattern[j] || (pattern[j] == '.' && i < str.length)))
35             return matchCore(str, i + 1, pattern, j + 1);
36         return false;
37     }
38 
39     public static void main(String[] args) {
40         char[] str = { 'a', 'a' };
41         char[] pattern = { 'a', '*' };
42         StringMatch ma = new StringMatch();
43         System.out.println(ma.match(str, pattern));
44     }
45 }

 

posted @ 2019-03-28 23:10  Practical  阅读(310)  评论(0编辑  收藏  举报