这篇文章主要讲如何使用正则匹配中文字符,中文正则表达式的匹配规则不像其他正则规则一样容易记住,下面一起看看这个中文正则表达式是怎么样的。
\w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下
或许你也需要匹配双字节字符,中文也是双字节的字符
注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
更多常用正则表达式匹配规则:
匹配中文,英文字母和数字及_:
1、一个正则表达式,只含有汉字、数字、字母、下划线不能以下划线开头和结尾:
^ 与字符串开始的地方匹配
(?!_) 不能以_开头
$ 与字符串结束的地方匹配
2、只含有汉字、数字、字母、下划线,下划线位置不限:
3、由数字、26个英文字母或者下划线组成的字符串
以上所述是小编给大家介绍的中文正则表达式匹配问题之正则表达式中文匹配使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
}
先过滤掉无效参数,比如:
在s串中,不能有.
和*
两个字符,
在p串中,两个*
不能相邻,*
不能出现在p串的开始位置。
以上两种情况下,直接返回false
即可。
接下来,我们定义递归函数
递归含义是:p字符串从pi出发一直到最后的字符,能否匹配出s这个字符串从si出发,一直到最后的字符串。
如果递归含义是如上定义,那么主函数调用
显然,当pi到结尾位置的时候,即:无匹配串的时候,si必须也要到结尾位置才能算匹配,否则不可能匹配上
如果没有到结尾位置,说明:
如果此时si到了结尾,此时pi往后的字符串必须要能消化成空串才能匹配,要让pi及其往后消化成空串,则pi及其往后一定要是偶数长度的字符串,因为如果是奇数长度的字符串,无论如何都变不成空串。除了pi及其往后要符合偶数长度的字符串,pi及其往后的字符串一定要满足若干个:
的模式,这样才能让有效字符被*
消化成空字符串。
// pi及以后的字符必须首先是偶数个,剩余奇数个数了,后面如何都做不到变成空串了。 // 后面必须是 : 有效字符 + "*"的组合模式
如果没有满足如上的if
条件,则说明:
si也没到头,pi也没到头
此时,如果pi到了有效字符的最后一个位置,或者pi的下一个位置不是*
,则p[pi]
必须要独立面对s[si]
,此时如果要匹配上,则首先需要满足
其次,s串从si+1一直到最后,也要可以被p串从pi+1到最后匹配上,逻辑如下:
如果也逃过了上述的判断,则说明:
那么p[pi]
和 p[pi+1]
至少可以先消解为空串,即p[pi]
位置不做匹配,逻辑如下:
如果逃过了这步,说明p[pi]
消解为空串这条道路行不通,所以只能让:p[pi]
匹配 s[si]
,然后将p[pi+1]
位置上的的*
衍生出:
然后去匹配s串剩余的字符串。
// 只要匹配上了就直接返回true // 首先过滤掉无效字符 // *不能在exp的第一个位置 // 两个*不能连在一起 // pi及以后的字符必须首先是偶数个,剩余奇数个数了,后面如何都做不到变成空串了。 // 后面必须是 : 有效字符 + "*"的组合模式 // 如果走到这步,p[pi]消解为空串这条道路行不通
暴力方法中,递归函数的可变参数有两个,而且是简单参数,所以可以改成二维动态规划,大家自行整理可能性和格子依赖关系,我自己整理了两遍,已晕:),完整代码为:
// 首先过滤掉无效字符
通过动态规划解法,发现了一个可以优化的地方,如果可以省略动态规划解法中的下述for
循环,那算法效率就可以高很多,
通过分析可以得到,对于一个普遍位置(i,j),如上for
循环其实依赖关系是:
当初我们在求(i+1,j)的时候,我们依赖的位置是:
所以(i,j)位置可以由(i+1,j)和(i+1,j+2)推导出来,如上for
循环就简化了,优化后的代码如下:
// 首先过滤掉无效字符
}