字符串——正则表达式匹配
2017-05-12 18:23
239 查看
【题目描述】
请实现一个函数用来匹配包括”.”和”*”的正则表达式。模式中的字符”.”表示任意一个字符,而”*”表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串”aaa”与模式”a.a”和”ab*b*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配
问题1:此处的”.”是如何进行匹配的,是否包含需要进行转义的特殊字符?
【解题思路】
当模式中的下一个字符不是”*”时:如果字符串当前字符和模式中的当前字符相匹配,那么字符串指针和模式指针都后移一个字符,然后匹配剩余的。
如果字符串当前字符和模式中当前字符不匹配,直接返回false。
当模式中的下一个是”*”时:
如果字符串当前字符跟模式当前字符不匹配,则模式指针后移2个字符,继续匹配。
如果字符串当前字符跟模式当前字符匹配,可以有3种匹配方式:
1、模式指针后移2字符,相当于x*被忽略;
2、字符串指针后移1字符,模式指针后移2字符;
3、字符串指针后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位;
这里需要注意的是:Java里,要时刻检验数组是否越界。
【源码展示】
测试样例:s1 = “aaa”, s2 = “ab*b*ac*a”public class Solution { public static void main(String[] args) { //1. 如何将一个字符串转换为字符数组? String s1 = "aaa"; char[] sourceStr = s1.toCharArray(); String s2 = "aa.a"; char[] patternStr = s2.toCharArray(); Boolean result = new Solution().match(sourceStr, patternStr); System.out.println("字符串[" + s1 + ", " + s2 +"]匹配:" + result); } public boolean match(char[] str, char[] pattern) { if (str == null || pattern == null) { return false; } int strIndex = 0; int patternIndex = 0; return matchCore(str, strIndex, pattern, patternIndex); } public boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex) { //有效性检验:str到尾,pattern到尾,匹配成功 if (strIndex == str.length && patternIndex == pattern.length) { return true; } //pattern先到尾,匹配失败 if (strIndex != str.length && patternIndex == pattern.length) { return false; } //模式第2个(next字符)是*,且字符串第1个(当前字符)跟模式第1个(当前字符)匹配,分3种匹配模式; //若字符串第1个(当前字符)跟模式第1个(当前字符)不匹配,模式指针后移2位 if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') { if ((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)) { //视为模式匹配1个字符 return matchCore(str, strIndex, pattern, patternIndex + 2) //视为模式匹配1个字符 || matchCore(str, strIndex + 1, pattern, patternIndex + 2) //*匹配1个,再匹配str中的下一个 || matchCore(str, strIndex + 1, pattern, patternIndex); } else { return matchCore(str, strIndex, pattern, patternIndex + 2); } } //模式第2个不是*,且字符串第1个(当前字符)跟模式第1个(当前)匹配,则都后移1位,否则直接返回false if ((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)) { return matchCore(str, strIndex + 1, pattern, patternIndex + 1); } return false; } }
【相关问题总结】
1.如何将一个字符串转换为字符数组?
public class Sol 4000 ution { public static void main(String[] args) { String string = "aaa"; char[] charArray = string.toCharArray(); for(int i=0; i<charArray.length; i++) { System.out.print(charArray[i] + " "); } } }
2.此处的”.”是如何进行匹配的,是否包含需要进行转义的特殊字符?
由pattern[patternIndex] == ‘.’可知,此处的”.”匹配任意ASCII字符相关文章推荐
- 运行一个命令或程序获取结果/正则表达式查找匹配/分隔字符串
- 使用正则表达式匹配字符串格式
- 匹配字符串的图片的正则表达式
- MySQL 字符串模式匹配 扩展正则表达式模式匹配
- 正则表达式匹配字符串中的数值部分并将其返回
- Apache - 模块 - mod_rewrite - RewriteRule - 匹配任意字符串时,可以借助正则表达式的灵活特性
- 使用正则表达式,进行批量修改字符串中的匹配内容
- 正则表达式匹配字符串中的数值部分并将其返回
- 使用正则表达式匹配特殊字符串,例一
- 正则表达式-匹配txt中的特定字符串
- 正则表达式:匹配字符串中除了"abc"以外的所有其它部分
- C#中使用正则表达式匹配字符串
- java 的正则表达式(Parrent),匹配字符串
- 正则表达式 字符串完全匹配
- 21.2.5 获取与正则表达式进行匹配检测的字符串
- RewriteRule中的正则表达式需要考虑是否要加上^(匹配字符串开头)
- Asp.net的正则表达式,匹配指定的字符和字符串。
- 正则表达式匹配字符串
- 正则表达式匹配EXCEL地址字符串
- #笔试#字符串 匹配 正则表达式 C++