Java 正则表达式分组与捕获

JAVA 正则表达式 分组与捕获 import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Fenzhu { public static void main(String[] args) { Pattern p = Pattern.compile("(/d{3,5})([a-z]{2})"); String s = "123aa-34345bb-234cc-00"; Matcher m = p.matcher(s); while(m.find()) { System.out.println("m.group():"+m.group()); //打印所有 System.out.println("m.group(1):"+m.group(1)); //打印数字的 System.out.println("m.group(2):"+m.group(2)); //打印字母的 System.out.println(); } System.out.println("捕获个数:groupCount()="+m.groupCount()); } } 1 概述 1.1 什么是捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。 捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组,通常所说的捕获组指的是普通捕获组。语法如下: 普通捕获组: (Expression) 命名捕获组: (?<name>Expression) ...

Created 19196-08-19 · Updated 9096-10-09 · 4 min · 642 words · -

JS 正则标志 /g /i /m 的用法

js正则标志/g /i /m的用法 正则的思想都是一样的,但是具体的写法会有所不同,在这里提到的/g,/i,/m在其他的地方也许就不能用了。 一,js正则标志/g,/i,/m说明 1,/g 表示该表达式将用来在输入字符串中查找所有可能的匹配,返回的结果可以是多个。如果不加/g最多只会匹配一个 2,/i 表示匹配的时候不区分大小写 3,/m 表示多行匹配,什么是多行匹配呢?就是匹配换行符两端的潜在匹配。影响正则中的^$符号 二,实例说明 1,/g的用法 查看复制打印? <script type="text/javascript"> str = "tankZHang (231144)"+ "tank ying (155445)"; res = str.match(/tank/); //没有加/g alert(res); //显示一个tank res = str.match(/tank/g); //加了/g alert(res); //显示为tank,tank </script> 2,/i的用法 查看复制打印? <script type="text/javascript"> str = "tankZHang (231144)"+ "tank ying (155445)"; res = str.match(/zhang/); alert(res); //显示为null res = str.match(/zhang/i); //加了/i alert(res); //显示为ZHang </script> 3,/m的用法 查看复制打印? <script type="text/javascript"> var p = /$/mg; var s = '1\n2\n3\n4\n5\n6'; alert(p.test(s)); //显示为true alert(RegExp.rightContext.replace(/\x0A/g, '\\a')); //显示\a2\a3\a4\a5\a6 alert(RegExp.leftContext); //显示为竖的2345 alert(RegExp.rightContext); //显示为6 var p = /$/g; var s = '1\n2\n3\n4\n5\n6'; alert(p.test(s)); //显示为true alert(RegExp.rightContext.replace(/\x0A/g, '\\a')); //什么都不显示 alert(RegExp.leftContext); //显示为竖的123456 alert(RegExp.rightContext); //什么都不显示 var p = /^/mg; var s = '1\n2\n3\n4\n5\n6'; alert(p.test(s)); //显示为true alert(RegExp.rightContext.replace(/\x0A/g, '\\a')); //显示为1\a2\a3\a4\a5\a6 alert(RegExp.leftContext); //显示为竖的12345 alert(RegExp.rightContext); //显示为6 </script> //从上例中可以看出/m影响的^$的分割方式 上面说的三个例子,/i,/g,/m分开来说的,可以排列组合使用的。个人觉得/m没有多大用处 http://blog.51yip.com/jsjquery/1076.html javascript 密码 正则 let testPassword = /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)(?=.*?[!@#$%^&;*()_=+\-])[a-zA-Z\d!@#$%^&;*()_=+\-]*$/; //判断输入格式 if(testPassword.test(this.passwordText)){ ...密码匹配成功 }else { ...密码匹配失败 } ———————————————— 版权声明:本文为CSDN博主「weixin_42553179」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_42553179/article/details/103045970 ...

Created 10106-03-10 · Updated 9096-10-09 · 1 min · 165 words · -

Regex Lazy Matching 正则惰性匹配 .*?

正则, 惰性匹配(lazy) .*? http://www.nowamagic.net/librarys/veda/detail/1038 使用场景 有时,我们想用正则匹配以某个子串开头,且以某个子串或字符结尾的子字符串,但是结尾的字串或字符在原字符串中出现了多次,但我们只想匹配从开始处到第一次出现的地方,换句话说,想得到开始和结尾之间内容最少的匹配。 正则的贪婪与非贪婪(惰性) 通常使用如下字符类描述前导字符的重复特征: ?: 告诉引擎匹配前导字符0次或一次。事实上是表示前导字符是可选的。 +: 告诉引擎匹配前导字符1次或多次。 *: 告诉引擎匹配前导字符0次或多次。 {min, max}: 告诉引擎匹配前导字符min次到max次。min和max都是非负整数。如果有逗号而max被省略了,则表示max没有限制;如果逗号和max都被省略了,则表示重复min次。 因此 {0,} 和 * 一样,{1,} 和 + 的作用一样。 贪婪 默认情况下,? + * {min, max}都是贪婪的,也就是说,它会根据前导字符去匹配尽可能多的内容。 非贪婪(惰性) 非贪婪就是匹配尽可能少的内容。 原理浅析 结合实例来分析哈基于正则的引擎对文本的匹配过程。原始字符串:This is a <EM>first</EM> test,使用正则 <.+> 来匹配HTML标签,期望第一次匹配得到<EM>,第二次匹配得到</EM>,实际却是第一次匹配就得到了 <EM>first</EM>。 来看看匹配过程,第一个记号是 <,这是一个文本字符,匹配其自身。第二个符号是.,匹配了字符E,然后+一直可以匹配其余的字符,直到一行的结束。然后到了换行符,匹配失败(.不匹配换行符)。于是引擎开始对下一个正则表达式符号进行匹配,即试图匹配 >。到目前为止,<.+ 已经匹配了 <EM>first</EM> test。引擎会试图将 > 与换行符进行匹配,结果失败了。于是引擎进行回溯。回溯后的匹配状况是 <.+ 匹配 <EM>first</EM> tes。于是引擎将 > 与 t 进行匹配。显然还是会失败。这个过程继续,直到 <.+ 匹配 <EM>first</EM,> 与 > 匹配。于是引擎找到了一个匹配 <EM>first</EM>。记住,正则导向的引擎是急切的,所以它会急着报告它找到的第一个匹配。而不是继续回溯,即使可能会有更好的匹配,例如<EM>。所以我们可以看到,由于+的贪婪性,使得正则表达式引擎返回了一个最左边的最长的匹配。 如果想得到期望的结果,就需要启用非贪婪模式:<.+?> 总结:如果是贪婪匹配模式,正则引擎会一直匹配到字符串最后;当匹配为false时,就回溯以找到倒数第一个匹配位置,返回匹配结果。 如果是非贪婪匹配模式,正则引擎会匹配到符合pattern的末尾位置那个字符,然后再往后走一步,发现匹配为false时,就回溯以找到最近一个匹配为true的位置,返回匹配结果。 实例 例如,原始字符串: ...

Created 24246-09-24 · Updated 9096-10-09 · 1 min · 103 words · -

go regex, 正则

go regex, 正则 nodes := []string{"foo.bar-000.x", "foo.t0.bar","foo.bar"} reg := regexp.MustCompile(`foo\.(.[^\.]*)\.{0,1}.*`) for _, v := range nodes { result := reg.FindSubmatch([]byte(v)) fmt.Println("output: ", string(result[1])) } [^a-zA-Z ]+, 匹配所有不是小写大写字母和空格的字符 . 匹配任意一个字符, 如果设置 s = true, 则可以匹配换行符 [字符类] 匹配"字符类"中的一个字符,"字符类"见后面的说明 [^字符类] 匹配"字符类"外的一个字符,"字符类"见后面的说明 \小写Perl标记 匹配"Perl类"中的一个字符,"Perl类"见后面的说明 \大写Perl标记 匹配"Perl类"外的一个字符,"Perl类"见后面的说明 [:ASCII类名:] 匹配"ASCII类"中的一个字符,"ASCII类"见后面的说明 [:^ASCII类名:] 匹配"ASCII类"外的一个字符,"ASCII类"见后面的说明 \pUnicode普通类名 匹配"Unicode类"中的一个字符(仅普通类),"Unicode类"见后面的说明 \PUnicode普通类名 匹配"Unicode类"外的一个字符(仅普通类),"Unicode类"见后面的说明 \p{Unicode类名} 匹配"Unicode类"中的一个字符,"Unicode类"见后面的说明 \P{Unicode类名} 匹配"Unicode类"外的一个字符,"Unicode类"见后面的说明 复合: xy 匹配 xy (x 后面跟随 y) x|y 匹配 x 或 y (优先匹配 x) 重复: x* 匹配零个或多个 x,优先匹配更多(贪婪) x+ 匹配一个或多个 x,优先匹配更多(贪婪) x? 匹配零个或一个 x,优先匹配一个(贪婪) x{n,m} 匹配 n 到 m 个 x,优先匹配更多(贪婪) x{n,} 匹配 n 个或多个 x,优先匹配更多(贪婪) x{n} 只匹配 n 个 x x*? 匹配零个或多个 x,优先匹配更少(非贪婪) x+? 匹配一个或多个 x,优先匹配更少(非贪婪) x?? 匹配零个或一个 x,优先匹配零个(非贪婪) x{n,m}? 匹配 n 到 m 个 x,优先匹配更少(非贪婪) x{n,}? 匹配 n 个或多个 x,优先匹配更少(非贪婪) x{n}? 只匹配 n 个 x 分组: ...

Created 12126-10-12 · Updated 12126-10-12 · 6 min · 1122 words · -

java正则表达式的中的问号

java正则表达式的中的问号 java正则表达式中的 ? 是惰性匹配,具体的看下面的例子: Pattern pattern = Pattern.compile("<.*>"); Matcher matcher =pattern.matcher("主页"); System.out.println(matcher.replaceAll("")); 将输出空,因为没有加问号,此时进行的是最长匹配(贪婪匹配) 可以做如果更改 Pattern pattern = Pattern.compile("<.*>"); Matcher matcher =pattern.matcher("主页[color=red]</a[/color]"); System.out.println(matcher.replaceAll("")); 将输出: 主页</a 如果把程序修改为: Pattern pattern = Pattern.compile("<.*?>"); Matcher matcher =pattern.matcher("主页"); System.out.println(matcher.replaceAll("")); 将输出: 主页 不加 ? 表示贪婪,加 ? 表示勉强,区别如下: 勉强是从左边一个一个地吃直到匹配为止,不加 ?的是一口吃掉整个字符串,然后从最后一个一个地吐出来直到匹配为止 字符串 a=====b=====b=== a.*b 将匹配满足条件最长的字符串 a=====b=====b 工作方式: 首先将: a=====b=====b=== 全部吃掉,从右边一个一个地吐出来 1. a=====b=====b=== 不匹配,吐出一字符 a=====b=====b== 不匹配,再吐出一字符 a=====b=====b= 不匹配,再吐出一字符 a=====b=====b 匹配了,结束。如果再不匹配继续吐,直到没有字符了,匹配失败 a.*? 将匹配满足条件最短的字符串 a=====b 工作方式: 从左边一个一个地吃掉字符 ...

Created 19196-08-19 · Updated 19196-08-19 · 1 min · 83 words · -

Java正则表达式

Java正则表达式 大写字母和数字组成的10个字符 private static final Pattern pattern = Pattern.compile("([A-Z]|[0-9]){10}"); pattern.matcher("abcd1234567").matches(); 3位数字 d{3} 众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符 (例如字符a到z) 以及特殊字符 (元字符) 组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。 // 反斜杠 /t 间隔 (’/u0009’) /n 换行 (’/u000A’) /r 回车 (’/u000D’) /d 数字 等价于[0-9] /D 非数字 等价于[^0-9] /s 空白符号 [/t/n/x0B/f/r] /S 非空白符号 [^/t/n/x0B/f/r] /w 单独字符 [a-zA-Z_0-9] /W 非单独字符 [^a-zA-Z_0-9] /f 换页符 /e Escape /b 一个单词的边界 /B 一个非单词的边界 /G 前一个匹配的结束 ^为限制开头 ^java 条件限制为以Java为开头字符 $为限制结尾 java$ 条件限制为以java为结尾字符 . 条件限制除/n以外任意一个单独字符 java.. 条件限制为java后除换行外任意两个字符 加入特定限制条件「[]」 [a-z] 条件限制在小写a to z范围中一个字符 [A-Z] 条件限制在大写A to Z范围中一个字符 [a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符 [0-9] 条件限制在小写0 to 9范围中一个字符 [0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符 [0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集) ...

Created 19196-08-19 · Updated 19196-08-19 · 3 min · 540 words · -

javascript

javascript 长数字格式化 (10000).toLocaleString('en-US'); // 输出 10,000 打印对象类型 foo.getClass() window.event.keyCode ascii //check if ESC pressed if (window.event.keyCode == 27) { $("#english").val("); } //check if enter pressed keyCode == 13 日期 ms > date string new Date(1636183170962).toLocaleString('en-US') 日期时间函数 var a=new Date(); var y = a.getFullYear()+ “- “; var m = a.getMonth()+ “- “; var d = a.getDate()+ “- “; var h = a.getHours()+ “- “; var x = a.getMinutes()+ “- “; var s = a.getSeconds()+ “- “; var ms=a.getMilliseconds()+ “- “; ...

Created 30306-07-30 · Updated 30306-07-30 · 3 min · 549 words · -

golang 正则

“golang 正则” https://studygolang.com/articles/7256 func main() { fmt.Println(regexp.Match("H.* ", []byte("Hello World!"))) // true }

1 min · 13 words · -