正则表达式生成算法(实现正则表达式)
本文给大家谈谈正则表达式生成算法,以及实现正则表达式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录:
- 1、正则表达式如何匹配 3 的倍数?
- 2、请问JAVA中正则表达式匹配怎么实现的!
- 3、算法和正则表达式的区别
正则表达式如何匹配 3 的倍数?
1. 用户给出你要学习的正则语言涉及的字符集,比如本题目中的 0123456789
2. 然后程序会反复询问你某个句子是否属于该语言,你就回答yes或者no就行了,然后程序会给你返回一个可能的正则语言(用DFA的形式)。
3. 如果你发现这个生成的正则语言和你想的不一样,你可以给出一个反例,然后程序继续给你计算你可能想要的自动机
这里有一个我刚刚写好的实现 xuanhuangyiqi/AnluinLearning · GitHub ,目前只能处理基本字符,另外这个算法输出的是自动机,不是最终的正则表达式,而且我还没找到比较完美的自动机转换成正则表达式的方法,所以目前我的实现生成的正则表达式是有bug的。本来这个东西是打算考完试再写的,刚好看到了这个问题,就手抖写了个简单的,考完试再慢慢完善。
如果打算理解这个算法可能需要一些基本的自动机理论基础:
1. 能看懂其它答案的做法,理解正则语言、DFA、正则表达式的关系
2. 理解最简DFA、状态/句子之间的等价
3. 理解这个算法的目标是维护一个自动机的封闭性和一致性
请问JAVA中正则表达式匹配怎么实现的!
Java中正则表达式匹配的语法规则:
以下是整理出来的Java下运用正则表达式实现匹配的程序案例,代码如下:
package?org.luosijin.test;
import?java.util.regex.Matcher;
import?java.util.regex.Pattern;
/**
?*?正则表达式
?*?@versiON?V5.0
?*?@author?Admin
?*?@date???2015-7-25
?*/
public?class?Regex?{
????/**
?????*?@param?args
?????*?@author?Admin
?????*?@date?2015-7-25
?????*/
????public?static?void?main(String[]?args)?{
????????Pattern?pattern?=?Pattern.compile("b*g");
????????Matcher?matcher?=?pattern.matcher("bbg");
????????System.out.println(matcher.matches());
????????System.out.println(pattern.matches("b*g","bbg"));
????????//验证邮政编码
????????System.out.println(pattern.matches("[0-9]{6}",?"200038"));
????????System.out.println(pattern.matches("//d{6}",?"200038"));
????????//验证电话号码
????????System.out.println(pattern.matches("[0-9]{3,4}//-?[0-9]+",?"02178989799"));
????????getDate("Nov?10,2009");
????????charReplace();
????????//验证身份证:判断一个字符串是不是身份证号码,即是否是15或18位数字。
????????System.out.println(pattern.matches("^//d{15}|//d{18}$",?"123456789009876"));
????????getString("D:/dir1/test.txt");
????????getChinese("welcome?to?china,江西奉新,welcome,你!");
????????validateEmail("luosijin123@163.com");
????}
????/**
?????*?日期提取:提取出月份来
?????*?@param?str
?????*?@author?Admin
?????*?@date?2015-7-25
?????*/
????public?static?void?getDate(String?str){
????????String?regEx="([a-zA-Z]+)|//s+[0-9]{1,2},//s*[0-9]{4}";
????????Pattern?pattern?=?Pattern.compile(regEx);
????????Matcher?matcher?=?pattern.matcher(str);
????????if(!matcher.find()){
????????????System.out.println("日期格式错误!");
????????????return;
????????}
????????System.out.println(matcher.group(1));????//分组的索引值是从1开始的,所以取第一个分组的方法是m.group(1)而不是m.group(0)。
????}
????/**
?????*?字符替换:本实例为将一个字符串中所有包含一个或多个连续的“a”的地方都替换成“A”。
?????*?
?????*?@author?Admin
?????*?@date?2015-7-25
?????*/
????public?static?void?charReplace(){
????????String?regex?=?"a+";
????????Pattern?pattern?=?Pattern.compile(regex);
????????Matcher?matcher?=?pattern.matcher("okaaaa?LetmeAseeaaa?aa?booa");
????????String?s?=?matcher.replaceAll("A");
????????System.out.println(s);
????}
????/**
?????*?字符串提取
?????*?@param?str
?????*?@author?Admin
?????*?@date?2015-7-25
?????*/
????public?static?void?getString(String?str){
????????String?regex?=?".+/(.+)$";
????????Pattern?pattern?=?Pattern.compile(regex);
????????Matcher?matcher?=?pattern.matcher(str);
????????if(!matcher.find()){
????????????System.out.println("文件路径格式不正确!");
????????????return;
????????}
????????System.out.println(matcher.group(1));
????}
????/**
?????*?中文提取
?????*?@param?str
?????*?@author?Admin
?????*?@date?2015-7-25
?????*/
????public?static?void?getChinese(String?str){
????????String?regex?=?"[//u4E00-//u9FFF]+";//[//u4E00-//u9FFF]为汉字?
????????Pattern?pattern?=?Pattern.compile(regex);
????????Matcher?matcher?=?pattern.matcher(str);
????????StringBuffer?sb?=?new?StringBuffer();
????????while(matcher.find()){
????????????sb.append(matcher.group());
????????}
????????System.out.println(sb);
????}
????/**
?????*?验证Email
?????*?@param?email
?????*?@author?Admin
?????*?@date?2015-7-25
?????*/
????public?static?void?validateEmail(String?email){
????????String?regex?=?"[0-9a-zA-Z]+@[0-9a-zA-Z]+//.[0-9a-zA-Z]+";
????????Pattern?pattern?=?Pattern.compile(regex);
????????Matcher?matcher?=?pattern.matcher(email);
????????if(matcher.matches()){
????????????System.out.println("这是合法的Email");
????????}else{
????????????System.out.println("这是非法的Email");
????????}
????}
}
算法和正则表达式的区别
算法和正则正则 这两者貌似没什么关系吧 . 算法是实现某种目的的过程.
在C语言里是一个函数 , java里是一个方法 , 正则表达式是一个匹配字符串的规则 , 一种模式.
正则当然是通过算法来实现的 , java里的Patter 类底层代码怎么实现正则的匹配功能?就是通过算法 .
比如 js里像这样一个正则: /\w{3}\d/ 表示匹配"3个字母一个数字"的字符串
正则的作用就是通过匹配来验证数据是否是指定的格式 , 比如在你注册帐号的时候匹配你的用户名密码是否按照要求填写 , 你的邮箱格式是否正确 , 还有就是正则可以方便的处理字符串的替换, 比如有的时候你得到一个几千行的字符串 你需要将每一行用引号引起来然后再末尾加个逗号 , 这时候手动处理的话要发疯 , 就可以用带有正则替换功能的工具处理 , 秒秒钟搞定,
程序里也一样,方便的替换掉匹配到的某些字符串.
本文关于正则表达式生成算法和实现正则表达式的内容来源于网络,版权归原作者所有,如有侵权,请联系删除!
【免备案CDN、高防CDN点击直达】
《正则表达式生成算法(实现正则表达式)》来自互联网同行内容,若有侵权,请联系我们删除!
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~