网站建设合同网站建设公司,厦门快速建网站,大型物流公司网站,企业营销型网站首先学习这个之前要先知道一些正则的基本知识。
随便百度一下正则表达式 – 元字符 | 菜鸟教程
字符描述\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如#xff0c;n 匹配字符 n。\n 匹配一个换行符。序列 \\ 匹…首先学习这个之前要先知道一些正则的基本知识。
随便百度一下正则表达式 – 元字符 | 菜鸟教程
字符描述\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如n 匹配字符 n。\n 匹配一个换行符。序列 \\ 匹配 \ 而 \( 则匹配 (。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性^ 也匹配 \n 或 \r 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性$ 也匹配 \n 或 \r 之前的位置。 * 匹配前面的子表达式零次或多次。例如zo* 能匹配 z 以及 zoo。* 等价于{0,}。 匹配前面的子表达式一次或多次。例如zo 能匹配 zo 以及 zoo但不能匹配 z。 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如do(es)? 可以匹配 do 或 does 。? 等价于 {0,1}。 {n} n 是一个非负整数。匹配确定的 n 次。例如o{2} 不能匹配 Bob 中的 o但是能匹配 food 中的两个 o。 {n,} n 是一个非负整数。至少匹配n 次。例如o{2,} 不能匹配 Bob 中的 o但能匹配 foooood 中的所有 o。o{1,} 等价于 o。o{0,} 则等价于 o*。 {n,m} m 和 n 均为非负整数其中n m。最少匹配 n 次且最多匹配 m 次。例如o{1,3} 将匹配 fooooood 中的前三个 o。o{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符 (*, , ?, {n}, {n,}, {n,m}) 后面时匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如对于字符串 ooooo? 将匹配单个 o而 o 将匹配所有 o。 . 匹配除换行符\n、\r之外的任何单个字符。要匹配包括 \n 在内的任何字符请使用像(.|\n)的模式。 (pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到在VBScript 中使用 SubMatches 集合在JScript 中则使用 $0…$9 属性。要匹配圆括号字符请使用 \( 或 \)。 (?:pattern) 匹配 pattern 但不获取匹配结果也就是说这是一个非获取匹配不进行存储供以后使用。这在使用 或 字符 (|) 来组合一个模式的各个部分是很有用。例如 industr(?:y|ies) 就是一个比 industry|industries 更简略的表达式。 (?pattern) 正向肯定预查look ahead positive assert在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配也就是说该匹配不需要获取供以后使用。例如Windows(?95|98|NT|2000)能匹配Windows2000中的Windows但不能匹配Windows3.1中的Windows。预查不消耗字符也就是说在一个匹配发生后在最后一次匹配之后立即开始下一次匹配的搜索而不是从包含预查的字符之后开始。 (?!pattern) 正向否定预查(negative assert)在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配也就是说该匹配不需要获取供以后使用。例如Windows(?!95|98|NT|2000)能匹配Windows3.1中的Windows但不能匹配Windows2000中的Windows。预查不消耗字符也就是说在一个匹配发生后在最后一次匹配之后立即开始下一次匹配的搜索而不是从包含预查的字符之后开始。 (?pattern)反向(look behind)肯定预查与正向肯定预查类似只是方向相反。例如(?95|98|NT|2000)Windows能匹配2000Windows中的Windows但不能匹配3.1Windows中的Windows。(?!pattern)反向否定预查与正向否定预查类似只是方向相反。例如(?!95|98|NT|2000)Windows能匹配3.1Windows中的Windows但不能匹配2000Windows中的Windows。x|y 匹配 x 或 y。例如z|food 能匹配 z 或 food。(z|f)ood 则匹配 zood 或 food。 [xyz] 字符集合。匹配所包含的任意一个字符。例如 [abc] 可以匹配 plain 中的 a。 [^xyz] 负值字符集合。匹配未包含的任意字符。例如 [^abc] 可以匹配 plain 中的p、l、i、n。 [a-z] 字符范围。匹配指定范围内的任意字符。例如[a-z] 可以匹配 a 到 z 范围内的任意小写字母字符。 [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如[^a-z] 可以匹配任何不在 a 到 z 范围内的任意字符。 \b 匹配一个单词边界也就是指单词和空格间的位置。例如 er\b 可以匹配never 中的 er但不能匹配 verb 中的 er。 \B 匹配非单词边界。er\B 能匹配 verb 中的 er但不能匹配 never 中的 er。 \cx 匹配由 x 指明的控制字符。例如 \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则将 c 视为一个原义的 c 字符。 \d 匹配一个数字字符。等价于 [0-9]。 \D 匹配一个非数字字符。等价于 [^0-9]。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \s 匹配任何空白字符包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 \w 匹配字母、数字、下划线。等价于[A-Za-z0-9_]。 \W 匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]。 \xn 匹配 n其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如\x41 匹配 A。\x041 则等价于 \x04 1。正则表达式中可以使用 ASCII 编码。 \num 匹配 num其中 num 是一个正整数。对所获取的匹配的引用。例如(.)\1 匹配两个连续的相同字符。 \n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式则 n 为向后引用。否则如果 n 为八进制数字 (0-7)则 n 为一个八进制转义值。 \nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式则 nm 为向后引用。如果 \nm 之前至少有 n 个获取则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足若 n 和 m 均为八进制数字 (0-7)则 \nm 将匹配八进制转义值 nm。 \nml 如果 n 为八进制数字 (0-3)且 m 和 l 均为八进制数字 (0-7)则匹配八进制转义值 nml。 \un 匹配 n其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如 \u00A9 匹配版权符号 (?)。
乍一看很多很复杂。最开始就先看标红的
然后看起始^和结束符$ 在看看贪婪和非贪婪 group再看看转义。好了你已经学会基本知识了。直接来实战。
regex函数
这个函数主要是来用于判断 字符串是否符合正则规则的返回值是boolean。 select abcdfeef regexp([1-9]) --false --看字符串里又没有1-9的数字 select abcdefg regexp([a-z]) --true -- 看字符串里又没有a-z的数字 select aabbccdd regexp((aa|11|)) --true-- 看字符串里又没有 aa 或则11 select abcdefg regexp ^a, --true是否以a开头abcdefg regexp g$, --true是否以g结尾abcdefg regexp (aa|bb), --false是否含有aa或者bb abcdefg regexp (ab|bb), --true 是否含有ab或者bbabcdefg regexp (^a|bb) --true 是否以a开头或者含有bb 比如我之前有个sql是看一个公司名是否含有“银行、保险有限、保险股份、证券有限、证券股份、信托、基金管理、期货”等字样 难道我一个个like %银行% or like%保险% ? select * from table where name regexp (银行|保险有限|保险股份|证券有限|证券股份|信托|基金管理|期货) 实战。 有个准入表中字段为准入人 数据如下 要求个人审批不动其余都改为系统准入 chenchi(陈池) zbf(朱某某) zbf2(朱某2) zbf10000(朱某10000) SGYX_SYFC_D1E605 --注意这个b玩意可能是哪个系统的准入 TBSHZ_QDFC_7A28F0 --注意这个b玩意可能是哪个系统的准入 ......... 一大堆都是这种系统自动的准入。 你说怎么搞 有小伙伴肯定就说了 你看又没有( ) like下。这个多lowb 而且开发环境和生产不一样万一生产有个系统准入叫做 XXXX_AAAA_(废弃)你怎么办 所以我们总结规律 (字符) 字符。 那么得出正则规律为 \\S[\\(].*[\\)] 解析 \\代表转义。 \\S代表的是多个字符也就是拼音 因为不确定有人是否有下划线空格例如 michael Jordan。 []代表 的是一个集合 \\(代表的是 本来\(就代表括号 但是\需要转义下 这个是中文括号 不需要转义 [\\(] 这个就代表 要么是中文括号 要么是英文括号开始 .*代表多个字符 [\\)] 这个代表反括号结尾 可以最后$ 以示严谨 select chenchi(陈池) regexp(\\S[\\(].*[\\)]), --truelove_zbf朱某某100 regexp(\\S[\\(].*[\\)]) --true 至此 好了你已经是一个入门正则选手了。
regex_extract
这个主要用于从一串字符串里提取自己想要的文字。
hive 函数说明。你去看oracle mysql 或者其他都行。 hive desc function extended regexp_extract; regexp_extract(str, regexp[, idx]) - extracts a group that matches regexp Example: SELECT regexp_extract(100-200, (\d)-(\d), 1) FROM src LIMIT 1; 100 Function class:org.apache.hadoop.hive.ql.udf.UDFRegExpExtract Function type:BUILTIN extracts a group that matches regexp 主要就是这句话。提取一个group上面说到了group。
Java 正则表达式 | 菜鸟教程
本想让大家自行学习想想有的小伙伴可能不懂。就贴出一张图自行领略
从中英文中提取数字
select regexp_extract(abcdefg1234hik, (\\d),1), --1 \\d代表的是一个数字regexp_extract(abcdefg1234hik, (\\d),1), --1234 \\这里因为代表的1或多次如果匹配到了那么就是尽可能的多这就是贪婪模式regexp_extract(abcdefg1234hik, (\\d?),1) --1 \\这里还是上面的意思?就代表了0-1次非贪婪模式 此时有小伙伴就会问了 我为啥还要呢直接来个 regexp_extract(abcdefg1234hik, (\\d?),1) --可惜结果是 空因为匹配到了0次。 又有小伙伴要问了我第一行不也是匹配到了 1 和贪婪非贪婪没关系不也ok么我只能说小虎版你太年轻了。千奇百怪的需求多的一批。 有个工商信息表涉及的金额如下 124.84万元 10万元突然来了个 20万美元 。这个时候我就怀疑可能有欧元港币英镑。 那么我怎么去找到到底有多少货币呢 看看大家又没有思路。几十万甚至上百万的数据你怎么去看呢你问业务 业务自己都不清楚。 思路 1.既然我看有多少货币 那么就是看单位了 万元 万美元这种。 2.我把前面的数字去掉不就好了distinct translate(registcapi,.0123456789,) 但是总感觉不太好因为后面的需求是把外币转化为人民币。translate有点满足不了需求这时候有小伙伴会说我可以 select registcapi, translate(registcapi,万元美欧港瑞士法郎,), translate(registcapi,.0123456789,) from odsiadata.ia_fdw_ic_enterprise_information 但是过了几天 这个列多了一个货币 津巴布韦币是不是又要改sql了呢所以还是用正则吧 select registcapi, regexp_extract(registcapi,(\\d(\.\\d)?)(.*),1) ,--整数小数 regexp_extract(registcapi,(\\d(\.\\d)?)(.*),2) ,-- .小数 regexp_extract(registcapi,(\\d(\.\\d)?)(.*),3) -- 单位 from odsiadata.ia_fdw_ic_enterprise_information 这个就不分析了。累了。
来个小案例 select a , regexp_extract(a,.*?\\..*?\\.(.*?)\\.,1), --非贪婪模式 regexp_extract(a,.*\\..*\\.(.*)\\.,1) -- 贪婪模式 一直不对 from ( select 缺省.银行存款-人民币-活期存款.China Merchants Bank Hong Kong Branch527118RMB.缺省1.缺省2.缺省3.缺省4.缺省5 as a )t 这是在oracle遇到的一个大概就是以 . 分隔 取第三个吧 regex_replace
这个就是正则替换主要是 实战