js六种正则表达式方法:matchs,test
正则表达式方法:reg.test(str),exec()
String对象方法:str.match(reg),search(),replace(),split()
js最常用test
/\s+\w+\s+/.test(" llyu ");对
"/\s+\w+\s+/".test(" llyu ")错
js正则语法
g (全文查找)
i (忽略大小写)
m (多行查找)
用法/a/gi;
"/"为开始和结束标志
js正则用例
String.prototype.trim=function(){
return this.replace(/(^\s+)|(\s+$)/g,"");
}
java两种正则表达式方法:pattern,String
Pattern类
Pattern p = Pattern.compile("(?<!c)a(\\d+)bd");
Matcher m = p.matcher("da12bca3434bdca4343bdca234bm");
while(m.find()){
System.out.println(m.group(1)); //我们只要捕获组1的数字即可。结果 3434
System.out.println(m.group(0)); // 0组是整个表达式,看这里,并没有提炼出(?<!c)的字符 。结果 a3434bd
}
分组,使用小括号"()"来指定
分组可以分为两种形式,捕获组和非捕获组。
捕获组 可以用“Back引用”
引用前面的表达式所捕获到的文本序列(是文本不是正则表达式)
\1(组1)就是对引号这个分组的引用,
非捕获组:为了节省内存等开销;以(?)开头
5中常见非捕获组
(?:X) X,作为非捕获组
(?=X ) 零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X) 零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配。
(?<=X) 零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!X) 零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配
ab33cd55cd66cd
ab(.*)cd \1得到33cd55cd66
ab(.*?)cd \1得到33
//匹配不包含"party"-----"((?!party).)*"
Ju(ne|ly)不必写成ju((ne)|(jly))
Pattern p = Pattern.compile(".*?(?<!c)a(\\d+)bd.*?");
Matcher m = p.matcher("dxa34bdza43bdca23bm");
while(m.find()){
System.out.println(m.start()+"-->"+m.end());
System.out.println(m.group(1));
}
结果:
0-->7
34
7-->13
43
Pattern p = Pattern.compile("^.*?(?<!c)a(\\d+)bd.*?$");
结果:
0-->19
34
Pattern p = Pattern.compile(".*?(?<!c)a(\\d+)bd.*?$");
0-->19
34
Pattern p = Pattern.compile("^.*?(?<!c)a(\\d+)bd.*?");
结果:
0-->7
34
Pattern p = Pattern.compile(".*(?<!c)a(\\d+)bd.*");
结果:
0-->19
43
贪婪匹配
a.*b 将匹配满足条件最长的字符串 a=====b=====b
工作方式:
首先将:a=====b=====b=== 全部吃掉,从右边一个一个地吐出来
1. a=====b=====b=== 不匹配,吐出一字符
2. a=====b=====b== 不匹配,再吐出一字符
3. a=====b=====b= 不匹配,再吐出一字符
4. a=====b=====b 匹配了,结束。
懒惰匹配
a.*? 将匹配满足条件最短的字符串 a=====b
工作方式:
1. a 不能匹配表达式,继续吃
2. a= 不能匹配表达式,继续吃
3. a== 不能匹配表达式,继续吃
4. a=== 不能匹配表达式,继续吃
5. a==== 不能匹配表达式,继续吃
6. a===== 不能匹配表达式,继续吃
7. a=====b 呵呵,终于能匹配表达式了,匹配结束。
如果学过编译原理的话应该知道 NFA,
Java 中正则表达式引擎采用的就是 NFA。反正我是没学过编译原理,也不懂“非确定型有穷自动机”
按匹配拆分下
dxa34bdz a 43 bd ca23bm
.* a \\d+ bd .*
整个串就完全符合匹配所以根本不需要去掉末尾字符了
// Pattern p = Pattern.compile("Brand=[0-9]{1,3}(&page=[0-9]+)?$");
Pattern p = Pattern.compile("Brand=[0-9]{1,3}(&page=[0-9]+)?");
Matcher m = p.matcher("Brand=31&page=1a2");
while(m.find()){
System.out.println(m.start()+"-->"+m.end());
System.out.println(m.group(1));
}
String reg="Brand=[0-9]{1,3}(&page=[0-9]+)?";
String str="Brand=31&page=1a2";
System.out.println(str.matches(reg));
结果:
0-->15
&page=1
false
str.matcher(reg)检查str完全符合reg,故此时"^","$"对reg可有可无
p.matcher(str)检查str是否包含符合reg的子串,故此时"^","$"对reg是有作用的
脚本放在 <body>的最后比较好,不会阻塞浏览器的下载线程,
可以比较一下效果,会快很多,尤其是在带图片的页面中。
(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(? <=X) X,通过零宽度的正 lookbehind
"abc(?i)def(?-i)g"
就表示abcg为小写 deg可大写的模式
捕获组,可以被记录下来放于内存中以便反向引用
非捕获组,可以提高匹配效率,节省内存
(?i) 也可以启用不区分大小写的匹配。
那"abc(?i)def(?-i)g"
Ju(?:ne|ly)
(?i) 打开忽略大小写开关,(?-i) 关掉忽略大小写开关,或者也可以
写成:abc(?i:def)g
Pattern p = Pattern.compile("(? <= <(\\w+)>)");
Matcher m = p.matcher(textStr);
怎么提示我(? <= <(\\w+)>)
红色的部分出错
Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 10
(? <= <(\w+)>)
lookbehind 其中所指定的字符必须是指定数量的,不能用 * + 之类的,但可以用 {0, 100} 这种确定型的。
lookahead 没有这种限制。
\1 这个是反向引用,只是记住 9 个捕获组 \10 表示组 1 和字符 0。
String str = "<b>aaaa</b>\n" +
"<h1>bbbbb</h1>\n" +
"<book>adfasdfadfasa\nsdfasdfadfasdf</book>\n" +
"<b>aaaa</b>";
// Pattern pattern = Pattern.compile("(?<=<(.{1,100}?)>)(?s:.)*?(?=</\\1>)");
Pattern pattern = Pattern.compile("(?<=<(.{1,100}?)>)(?s:.)*?(?=</\\1>)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println(matcher.group());
System.out.println();
}
(? <= <(\\w{0,100})>).*(?= </\\1)
和
(? <= <(.{1,100}?)>)(?s:.)*?(?= </\\1>)
这个有哪些区别啊?
就加了一个Pattern.DOTALL?
在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行结束符。
为什么你这个会匹配对称的啊? 我看不出里面的奥妙,能不能再解释一下啊?
对了为什么{1,100}后面加一个?号呢,我去了好象不行
还有(?s:.)*?也加了一个?号呢)?
我知道加?是代表勉强是吧,能不能通俗一点给我讲一下啊?
去了,为什么不行呢?奇怪
谢谢先
(?s:.) 将这个点用于 DOTALL 模式下,因为 <book>... </book> 中我加了个“\n”。
相关推荐
正则表达式是一个很强的工具,可以在你的软件中增强查找、替换、匹配等功能。附件中封装了Henry Spencer的regex library源码,有说明和范例,纯C可移值,简单易用。
用JAVA写的一个将正则表达式转换为NFA的代码,基于Thompson算法的思想,递归构建NFA。jar为源码文件。 输出非确定有限自动状态机的有向图。如正则表达式: c(a|b)NFA为:0-c->1-ep->2-a->3-ep->7 ,0-c->1-ep->4-b->5-...
正则表达式,正则表达式或正则表达式(有时称为有理表达式)是定义搜索模式的一系列字符。 通常,字符串搜索算法会将此类模式用于字符串的“查找”或“查找并替换”操作,或用于输入验证。 正则表达式是用于匹配...
REGEX-正则表达式-通过一种字符串模式来指定一种常规语言的一种顺序方式,该模式解释了可以由有限自动机描述的相同内容。 例如,在UNIX的REGEX表示法中,“ [AZ] [az] * [] [AZ] [AZ]”表示一个单词,该单词以大写...
目录正则表达式1. 正则标记1.1 字符1.2 字符... 真题5.1 压缩算法5.2 音节判断5.3 正则表达式匹配(剑指Offer 面试题19) 正则表达式 概述:描述了一种字符串匹配的模式,用来检查一个串是否含有某个子串、将匹配的子串替
发明BSD、TCP/IP、csh、vi和NFS的SUN首席科学家Bill Joy说过,在计算机...这些包括分组交换网络、WEB、lisp、哈希算法、UNIX、编译技术、关系模型、面向对象、XML这些大名鼎鼎的家伙,而正则表达式绝对不应该被漏掉。
整个教程大概有80个学时,同时也引入图像识别基础、算法基础、小游戏、爬虫、API设计基础、Excel文档操作、Numpy、Pandas、Matplotlib画图、数据库基础、网页WEB编程和Flask框架基础等,完成后将达到初级Python...
它遵循 Ken Thompson 的算法,用于从正则表达式构建 NFA。 查看我的了解完整的实现细节。 例子 const { createMatcher } = require ( './regex' ) ; const match = createMatcher ( '(a|b)*c' ) ; match ( 'ac' )...
生成解析树 (AST) 的快速正则表达式引擎。 它以匹配的文本大小的线性时间执行此操作,并以模式大小的 O(m*log(m)) 缩放。 算法 该算法描述于 尼科·施瓦茨。 可扩展的代码克隆检测。 博士论文,伯尔尼大学,2014 年...
对于不熟悉的人,regex Golf 希望用户提出一个与允许列表中的一组单词相匹配的正则表达式,而不应该与不允许列表中的一组单词相匹配。 而且,有一些有趣的尝试来看看计算机是否有可能解决这个问题。 回到我们的问题...
正则表达式树 我还没有为它编写测试(还),所以很可能存在错误。 我正在考虑通过使用树而不是构建 NFA/DFA 来进行正则表达式匹配的方法,并遇到了. 这是博客中描述的算法的实现,并进行了一些小调整。 树的构造...
正则表达式最近学习的编译原理,基于NFA实现了正则表达式,代码刚写完,具体内容参考博客 ,欢迎查阅。已实现NFA转DFA,详见博客 。目前还是demo,算是刚把引擎的骨架组装起来,后续继续完善代码。是什么不是什么?...
这是JavaScript中正则表达式引擎的简单实现,该引擎使用传统的“回溯”算法将正则表达式模式与字符串进行匹配。 引擎处理以下特殊正则表达式字符: ^字符串的开头 $字符串结尾 匹配上一个表达式0次或更多次 匹配上...
正则表达式 用Haskell编写的简单正则表达式引擎。 它没有使用回溯或有限自动机来匹配字符串,而是使用了派生函数。 这个想法和算法摘自的博客文章。 安装 git clone ...
将Regex的匹配和捕获能力与Levenshtein距离算法的比较能力相结合。 将字符串匹配到模式并提取变量,即使输入文本与模式不完全匹配也是如此。 例如: 模式: “我叫¿,我今年¿岁” 输入: “我叫约翰,我今年30岁...
提供比使用的算法更快的算法来匹配字符流上的正则表达式。 用法 一个典型的例子: // choose the character stream to modify Reader originalReader = ... // this reader is connected to the original data ...
这是今天java老师布置的课堂作业,排序算法可能不是非常的好。 新建一个studet类,导入以下类 import java.util.Arrays; import java.util.Scanner; import java.util.regex.Pattern; import org.hamcrest.Matcher; ...
文件的第一行必须包含一个中缀表示的正则表达式,只有 UNION 和 STAR 操作。 它也只接受以下字母表:('a', 'b', 'e')。 关于 中缀解析 它只是将表达式从中缀转换为后缀表示。 状态 此类包含机器的状态表示。 正则...
用c#实现 的爬虫算法的... //提取超链接的正则表达式 Regex MyHrefRegex = new Regex(MyHrefPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); Match MyHrefMatch = MyHrefRegex.Match(MyPage); while
jrexx - 基于自动机的 Java 正则表达式 api - 提供了非常快速的匹配算法、扩展的模式语法(具有用于补码、并集、交集、差集的集合操作)并允许对自动机的结构进行内省。