「java正则贪婪匹配」怎样让正则表达式由贪婪匹配变成非贪婪匹配
本篇文章给大家谈谈java正则贪婪匹配,以及怎样让正则表达式由贪婪匹配变成非贪婪匹配对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java中的正则表达式
- 2、JAVA正则表达式怎么匹配所有符合要求的子字符串
- 3、java过滤sql关键字的正则替换掉
- 4、正则表达式(二):断言
- 5、java 正则表达式matcher.group()匹配多种结果的规则
- 6、Java中的正则是什么意思?求解
java中的正则表达式
Java正则表达式 (img.*?)style=\".*?\" 替换成 $1
其中.*表示0个或0以上多个任意字符
.*?表示0个或0以上多个任意字符的非贪婪匹配,就是假如一个句子中有多个style,它匹配距离最近的那个style,同理后面的.*?匹配距离最近的双引号
$1表示反向引用,它代表的是正则表达式中的第一个小括号所括起来的分组的内容,如果有两个小括号括起来的内容,则分别用$1,$2表示它们(在替换后的字符串中)
完整的Java程序如下
123456public class CC { public static void main(String[] args) { String s="img src=\"file/img/2016/12-28/1234-25521482893088459.jpg\" title=\"1234.jpg\" alt=\"\" width=\"396\" height=\"271\" style=\"width: 396px; height: 271px;\"/"; System.out.println(s.replaceAll("(img.*?)style=\".*?\"", "$1")); }}
运行结果
img src="file/img/2016/12-28/1234-25521482893088459.jpg" title="1234.jpg" alt="" width="396" height="271" /
JAVA正则表达式怎么匹配所有符合要求的子字符串
正则有贪婪和非贪婪模式,所以你的最后集合只会有这两种的数据,不会出现如:zobo,boco。
代码片段:
Pattern pattern = Pattern.compile(".*?o");
Matcher matcher = pattern.matcher("zoboco");
while(matcher.find()){
String e=matcher.group(0);
System.out.println(e);
}
运行结果:
zo
bo
co
你可以通过这些结果按顺序排列组合出想要的组合数据如:zobo,boco,zoboco
关于java正则表达式的语法可以参考:java正则表达式语法详解及其使用代码实例
搜索"正则"的分享列表
java过滤sql关键字的正则替换掉
java过滤sql关键字的正则替换掉方法如下:
可以在C#中这样做:Regexregex = newRegex(@"]*[^");
stringcleanedHtml = regex.Replace(html, "");
可是我并不想再写个循环去遍历每条记录,然后保存每条记录,我想在数据库中一步到位,而sql只提供了简单的replace函数,这个函数明显不能达到咱的要求,那就去写一个自定义函数吧。
函数源代码如下:CREATE functiondbo.regexReplace
(@source ntext,--原字符串@regexp varchar(1000),--正则表达式@replace varchar(1000),--替换值@globalReplace bit=1,--是否是全局替换@ignoreCase bit=0 --是否忽略大小写)returnS varchar(1000)AS
begin
declare@hr intege
declare@objRegExp integer
declare@result varchar(5000)exec@hr =sp_OACreate'VBScript.RegExp',@objRegExp OUTPUT
IF@hr 0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OASetProperty@objRegExp,'Pattern',@regexp
IF@hr 0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OASetProperty@objRegExp,'Global',@globalReplace
IF@hr 0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OASetProperty@objRegExp,'IgnoreCase',@ignoreCase
IF@hr 0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OAMethod@objRegExp,'Replace',@result OUTPUT,@source,@replace
IF@hr 0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OADestroy@objRegExp
IF@hr 0 begin
returnnullend
return@result
end
需要注意的是,即使写好了这个函数,也并不能马上使用。执行这个函数时可能会出现以下的错误:Msg 15281, Level 16, State 1, Line 1
SQL Server blocked access to procedure 'sys.sp_OACreate' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' by using sp_configure. For more information about enabling 'Ole Automation Procedures', see "Surface Area Configuration" in SQL Server Books Online.
这是因为未开启Ole Automation Procedures选项,MSDN中的Ole Automation Procedures选项。执行下面的语句开启这个选项:sp_configure'show advanced options',1;GO
RECONFIGURE;GOsp_configure'Ole Automation Procedures',1;GO
RECONFIGURE;GO
所有的准备工作都已经做好,那就试验一下吧。
Example1:忽略大小写并替换selectdbo.regexReplace('123456',']*[^','',1,1)
Example2: 使用贪婪匹配
html代码:
Also Available - Smith Hogan: Criminal Law Cases Materials 10th ed
There is, as ever, detailed analysis of the many recent case developments, in particular,
a revision of the chapter dealing with secondary liability and joint enterprise.
调用代码:selectdbo.regexReplace(html,']*(.|\n)*?','',1,1)
Example3:去除html标签selectdbo.regexReplace('
Key Contact:
Mr Jack, Zhou
General Manager
Mr Adu, Ho
Marketing Director
Overseas Sales
MsWinny, Luo
Sales Manager
Overseas Sales',']*','',1,0)
Example4:数据库字段值替换updateBooks。
正则表达式(二):断言
在展开内容之前,首先有一个例子:
上面的例子反映了一个明显的正则匹配规则:贪婪匹配,即在符合正则表达式规则的情况下,总会匹配尽量多内容。
如果想使得正则表达式按最小内容匹配,只需要在次数元符号后加" ? "符号即可
" ? "作为懒惰匹配符号,放在次数元符号后,表示匹配符合规则的最少部分的内容。
这里说的断言也叫零宽度断言、环视,主要介绍以下表格中列出的四种
断言的功能很强大,使用很简单。 说断言的功能强大,是因为四种断言在使用上弥补了上一章中常见元符号的遗漏场景;使用很简单,因为只需要知道一种断言,其他三种的使用方式就自然清楚了。
由此可以看出断言其实也是一种描述位置的元符号,它指定的是符合(?=exp)规则的位置。
举例说明:
由上面例子可以看出,断言的作用就是指定一个位置,该位置的前后内容需要满足 exp 规则。由此可以推测出其他三种断言使用方式:
这里有个需要注意的地方,后发断言的使用中,exp结构中使用+、*、{m,n}、{m,}、{,n}等元符号来表示不确定次数时,可能会出一些问题。例如python语言中禁止使用这种形式来构造正则,java中支持{m,}、{m,n}确定范围的写法,其他的不确定次数形式也是禁止的。
关于断言的使用,有一种略粗糙的描述可以形容其与普通元符号的使用区别:相对于普通元符号在正则中的应用,断言相当于多加了一层判断。使用普通元符号来匹配字符串内容,那么使用断言就可以在匹配字符串内容的同时,校验要匹配的字符串长度是多少,字符串前面必须是什么内容,前面必须不能是什么内容,后面是什么内容,后面不能是什么内容。
java 正则表达式matcher.group()匹配多种结果的规则
这是由正则表达式的匹配策略所导致的,如果想要得到多个小的匹配结果你需要将正则表达式改为:
String reg = "乘+(.*?)+车";
即可得到想要的结果:
具体原理你可以查看这个链接: 讲的很详细
Java中的正则是什么意思?求解
正则是,一种字符串处理表达式,可进行文本的查找,替换,判断某个文本是否存在,子文本串的提取等操作,正则表达式的书写必须满足一定规则。
此处我指出一点,初学者,容易犯错的地方:
*?与*的区别,专业术语叫贪婪匹配与非贪婪匹配,通俗解释:如果我们要匹配一个html标记:
diva href="" target="123"知道/aa href="" target="123"腾讯/a/div
a.*?.*?/a能匹配上每一个a/a标签对,而:a.*?.*/a匹配上的是a href="" target="123"知道/aa href="" target="123"腾讯/a
总结所谓贪婪中间有多长不管,一直给匹配到最后一个适合的文本串。非贪婪只匹配到第一个找到的模式结束。
除了贪婪与非贪婪网上很难找到资料,术语很难理解。其他的很容易学会。
正则表达式是处理大文本效率极佳的一种工具。它的实现不单单是java,有javascript,unix文本处理命令(代表C语言有实现库),swift等流行语言,windows下的文本编辑器(如editplus,notepad++)。正则表达式,本段列举出来的语言工具基本上能完全支持。
总之正则表达式是一种很有用的工具,希望你能学好。
关于java正则贪婪匹配和怎样让正则表达式由贪婪匹配变成非贪婪匹配的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-26,除非注明,否则均为
原创文章,转载请注明出处。