• [技术干货] python re模块和正则表达式
    先来看一个例子:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/这是京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示。假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我们格式有误。这个功能是怎么实现的呢?假如现在你用python写一段代码,类似:phone_number = input('please input your phone number : ')你怎么判断这个phone_number是合法的呢?根据手机号码一共11位并且是只以13、14、15、18开头的数字这些特点,我们用python写了如下代码:12345678910111213# 方式一 判断号码是否合法# -*- coding:utf-8 -*-while True:  phone_number = str(input('please input your phone number : '))  if len(phone_number) == 11 \      and phone_number.isdigit() \      and (phone_number.startswith('13') \         or phone_number.startswith('14') \         or phone_number.startswith('15') \         or phone_number.startswith('18')):    print('是合法的手机号码')  else:    print('不是合法的手机号码')12345678# 方式二 判断号码是否合法# -*- coding:utf-8 -*-import rephone_number = str(input('please input your phone number : '))if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):    print('是合法的手机号码')else:    print('不是合法的手机号码')正则表达式不仅在python领域,在整个编程届都占有举足轻重的地位。不管以后你是不是去做python开发,只要你是一个程序员就应该了解正则表达式的基本使用。如果未来你要在爬虫领域发展,你就更应该好好学习这方面的知识。但是你要知道,re模块本质上和正则表达式没有关系。re模块和正则表达式的关系 类似于time模块和时间的关系。时间有自己的格式,年月日时分秒,12个月,365天......已经成为了一种规则。正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则。官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。二、正则表达式在线测试工具 http://tool.chinaz.com/regex/首先谈到正则,就只和字符串相关了。在我给你提供的工具中,你输入的每一个字都是一个字符串。其次,如果在一个位置的一个值,不会出现什么变化,那么是不需要规则的。比如你要用"1"去匹配"1",或者用"2"去匹配"2",直接就可以匹配上。这连python的字符串操作都可以轻松做到。那么在之后我们更多要考虑的是在同一个位置上可以出现的字符的范围。2.1 字符组字符组 : [字符组]在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示字符分为很多类,比如数字、字母、标点等等。假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。正则待匹配字符匹配结果说明[0123456789]8True在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配[0123456789]aFalse由于字符组中没有"a"字符,所以不能匹配[0-9]7True也可以用-表示范围,[0-9]就和[0123456789]是一个意思[a-z]sTrue同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示[A-Z]BTrue[A-Z]就表示所有的大写字母[0-9a-fA-F]eTrue可以匹配数字,大小写形式的a~f,用来验证十六进制字符2.2 元字符元字符匹配内容.匹配除换行符以外的任意字符\w匹配字母或数字或下划线\s匹配任意的空白符\d匹配数字\n匹配一个换行符\t匹配一个制表符\b匹配一个单词的结尾^匹配字符串的开始$匹配字符串的结尾\W匹配非字母或数字或下划线\D匹配非数字\S匹配非空白符a|b匹配字符a或字符b()匹配括号内的表达式,也表示一个组[...]匹配字符组中的字符[^...]匹配除了字符组中字符的所有字符2.3 量词量词用法说明*重复零次或更多次+重复一次或更多次?重复零次或一次{n}重复n次{n,}重复n次或更多次{n,m}重复n到m次2.3.1 . ^ $正则待匹配字符匹配结果说明小.小明小军小兰小明小军小兰匹配所有"小."的字符^小.小明小军小兰小明只从开头匹配"小."小.$小明小军小兰小兰只匹配结尾的"小.$"2.3.2 * + ? { }正则待匹配字符匹配结果说明小.?小明和小李子和小巧玲珑小明小李小巧?表示重复零次或一次,即只匹配"小"后面一个任意字符小.*小明和小李子和小巧玲珑小明和小李子和小巧玲珑*表示重复零次或多次,即匹配"小"后面0个或多个任意字符小.+小明和小李子和小巧玲珑小明和小李子和小巧玲珑+表示重复一次或多次,即只匹配"小"后面1个或多个任意字符小.{1,2}小明和小李子和小巧玲珑小明和小李子小巧玲{1,2}匹配1到2次任意字符注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配正则待匹配字符匹配结果说明小.*?小明和小李子和小巧玲珑小小小惰性匹配
  • [技术干货] 【转】linux sed 命令
    sed 是一个流编辑器(stream editor),主要用来执行文本替换。但 sed 的主要设计目的是以批处理的方式而不是交互的方式来编辑文件。命令简介基本命令格式sed [常用选项] 命令文本 输入常用选项    -n (--quiet, --silent):安静模式。在 sed 的基本用法中,所有来自标准输出的信息都会被列出到终端上。加上 -n 参数后,则只有被sed 处理的那些行才会被输出。    -e:指定在指令列模式上执行的命令文本。默认不需要指定,只有同时要执行多个命令文本时才需要显式的指定 -e 选项。    -f:同时要执行多个命令文本时,可以将这些命令文本写到一个文件中,然后通过 -f filename 的方式使用。    -r:sed 默认使用基础正则表达式语法(BRE),指定 -r 选项后使用扩展正则表达式语法(ERE)。    -i:直接修改读取的文档,而不是输出到终端。常用命令    a:新增行, a 的后面接字串,这些字串会被添加到匹配行的下面。    c:替换行, c 的后面接字串,这些字串会替换掉匹配到的行。    d:删除行,删除匹配到的行。    i:插入行, i 的后面接字串,这些字串会**入到匹配行的上面。    p:打印,将某些行输出。通常 p 会与参数  -n 一起使用,这样只输出匹配到的行。    s:字符串替换,主要搭配正则表达式使用。解释一下本文中 "命令" 与 "命令文本" 的区别:命令是一些抽象的操作,比如 a 指示新增行,d 指示删除行。命令文本则是由命令和其它一些信息组合起来的一个字符串,用来执行具体的操作。比如在第一行下面添加一行,内容为 'Hello world',命令文本为:'1a Hello world'再如删除包含字符串 'Hello world' 的行,命令文本为:'/Hello world/d'常用选项及命令详解说明:本文示例中 demo 文件 test.txt 包含三行文字,内容为:aabbccdemo 文件 hello.txt 包含三行文字,内容为:Hello world! Hello Jack!Hello China!Hello Nick!删除行删除行需要使用命令 d:$ sed '1d' test.txt            # 删除第一行$ sed '$d' test.txt            # 删除最后一行$ sed '1,2d' test.txt          # 删除第一行到第二行$ sed '2,$d' test.txt          # 删除第二行到最后一行注意,执行完上面的命令,我们只能在命令行终端上看到正确的结果,而 test.txt 文件根本没有发生变化:选项 -i 如果想要直接在原文件上进行修改(其实是先修改文件的内容,然后保存到原文件中),需要使用选项 -i:$ sed -i '1d' test.txt注意,应用 -i 选项后命令行上没有输出内容,但是源文件被更新了。新增行a 命令可以在匹配的行下面新增行:$ sed '1a Hello world!' test.txt                  # 在第一行下面新增一行,内容为 "Hello world!"$ sed '$a Hello world!' test.txt                  # 在最后一行下面新增一行,内容为 "Hello world!"$ sed '1,3a Hello world!' test.txt                # 在第一行,第二行和第三行下面分别增加一行,内容                                                                    # 为 "Hello world!" 1,3 表示从第一行到第三行$ sed '1a Hello world!\nHello China!' test.txt    # 一次增加多行需要使用换行符 \n选项 -e-e 选项用来指定命令文本,如果只有一个命令文本时 -e 选项可以省略。如何要指定多个命令文本就需要使用 -e 选项。$ sed -e '1a xxx' -e '2a yyy' test.txt插入行i 命令可以在匹配的行上面插入行,语法与新增行相同,只是新行在指定行的上面(与 a 命令的区别):选项 -f前面我们通过选项 -e 添加了多个命令文本,但是如果需要添加比较多的命令文本,使用选项 -e 就不太合适了。因为把所有的命令文本全部写在命令行中会导致维护困难。此时选项 -f 就派上用场了。我们可以把多个命令文本写入到文本文件中,然后通过 -f 选项进行引用。我们创建一个叫 commands 的文件,在里面添加三个命令文本如下:1i Hello world!2i Hello world!3i Hello world!然后执行命令:$ sed -f commands test.txt通过 -f 选项,commands 文件中的三个命令文本都被执行了!替换行使用 c 命令可以轻松的进行整行替换: $ sed '1c  Hello world!' test.txt         # 把第一行替换为 "Hello world!"$ sed '1,3c Hello world!' test.txt        # 把第一行到第三行替换为 "Hello world!"注意,上图中的命令把三行文本替换成了一行文本!字符串替换与行替换不同,s 命令只替换匹配到的内容(一般为字符串):$ sed 's/Hello/Hi/' hello.txt             # 把Hello 替换为 Hi上图带给我们的困惑之一是:为什么第一行中只有第一个 Hello 被替换了?答案是 sed 默认只会替换第一个匹配到的内容!那么我们的第二个困惑来了:如果只替换第一个匹配到的内容,那么为什么第二行和第三行的 Hello 都被替换了呢?这个问题涉及的 sed 的工作方式,sed 是一个以行为单位进行文本处理的工具!所以图中的三行是被分为三次,每次一行进行处理的。因而第二行和第三行中的 Hello 对于本行来说都是第一个匹配到的内容,被替换是正确的。要进行全局替换,需要在命令文本中指定 g,试试下面的命令:$ sed 's/Hello/Hi/g' hello.txt             # 把匹配到的所有Hello 都替换为 Hi这下第一行中的两个 Hello 都被替换了。我们还可以限制执行替换操作的行:$ sed '2,3s/Hello/Hi/g' hello.txt          # 只在第二行和第三行进行替换操作当然也可以通过替换来删除不需要的字符串:$ sed 's/Hello//g' hello.txt               # 删除字符串 Hello定界符虽然 / 是最常用的定界符,但是你也可以使用其它的字符。举个简单的例子,当你要在 linux 下进行路径替换时,使用 / 作为定界符是很不爽的(需要很多的转义符),此时换一个定界符是最好的解决方案:上图中我们使用分号作为定界符轻松实现了路径替换。匹配细心的同学可能已经注意到了,sed 所有的操作都是建立在行定位之上的。也就是说无论你要干什么,都要先找到(匹配)目标行。连最简单的删除行 '1d',也得先定位到第一行,然后才能删除。所以唯一能限制我们发挥 sed 能力的因素就是:如何匹配到期望的行?答案是掌握基本的规则,然后多练习! -n 选项和 p 命令是我们练习的好帮手。-n 选项告诉 sed 只输出那些被处理过的行。比如 sed '1a Hello world!' test.txt 命令默认会输出四行,应用 -n 后只输出一行:p 命令则告诉 sed 只输出那些匹配到的行, 比如命令:$ sed -n '1p' test.txt 和命令sed -n '2,3s/Hello/Hi/gp' hello.txt行匹配的规则大概有两类:通过行号进行匹配和通过正则表达式进行匹配。下面是一些通过行号进行匹配的例子:$ sed -n '1p' test.txt                 # 匹配第一行$ sed -n '$p' test.txt                 # 匹配最后一行$ sed -n '2,3p' test.txt               # 匹配第二行和第三行$ sed -n '3,$p' test.txt               # 匹配第三行和第三行后的每一行下面是通过正则表达式进行匹配的例子:$ sed -n '/Hello/p' hello.txt默认的匹配是区分大小写的,要忽略大小写可以使用I(大写字母i)$ sed -n '/hello/Ip' hello.txt下面几个是正则表达式匹配后执行操作的例子:$ sed '/Hello/d' hello.txt                # 找到匹配的行,并删除$ sed '/Hello/a world!' hello.txt         # 找到匹配的行,并在它们下面添加新行$ sed 's/world/China/g' hello.txt         # 把行中的 world 替换为 China$ sed '/Hello/s/world/China/g' hello.txt  # 找到匹配的行,在这些行中执行替换下面的例子通过正则表达式进行整行内容的替换:$ sed -i 's/^commonName.*/commonName = xxx/g' my.cnf$ sed -i 's/^subjectA**ame.*/subjectA**ame = DNS:xxx/g' my.cnf总结sed 是一个强有力的文本替换工具,尤其是需要在自动化的场景中使用的时候。本文结合实例比较详细的介绍了 sed 的使用方法,希望对大家了解、使用 sed 有所帮助。转自:https://www.cnblogs.com/sparkdev/p/7138073.html
  • [技术干货] SqlServer类似正则表达式的字符处理问题
    SQL Serve提供了简单的字符模糊匹配功能,比如:like, patindex,不过对于某些字符处理场景还显得并不足够,日常碰到的几个问题有:1. 同一个字符/字符串,出现了多少次2. 同一个字符,第N次出现的位置3. 多个相同字符连续,合并为一个字符4. 是否为有效IP/身份证号/手机号等 一. 同一个字符/字符串,出现了多少次同一个字符,将其替换为空串,即可计算declare @text varchar(1000) declare @str varchar(10) set @text = 'ABCBDBE' set @str = 'B' select len(@text) - len(replace(@text,@str,''))同一个字符串,仍然是替换,因为是多个字符,方法1替换后需要做一次除法;方法2替换时增加一个字符,则不需要--方法1 declare @text varchar(1000) declare @str varchar(10) set @text = 'ABBBCBBBDBBBE' set @str = 'BBB' select (len(@text) - len(replace(@text,@str,'')))/len(@str) --方法2 declare @text varchar(1000) declare @str varchar(10) set @text = 'ABBBCBBBDBBBE' set @str = 'BBB' select len(replace(@text,@str,@str+'_')) - len(@text)二. 同一个字符/字符串,第N次出现的位置SQL SERVER定位字符位置的函数为CHARINDEX:CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )可以从指定位置起开始检索,但是不能取第N次出现的位置,需要自己写SQL来补充,有以下几种思路:1. 自定义函数, 循环中每次为charindex加一个计数,直到为Nif object_id('NthChar','FN') is not null   drop function Nthchar GO create function NthChar ( @source_string as nvarchar(4000),  @sub_string  as nvarchar(1024), @nth      as int )  returns int as begin   declare @postion int   declare @count  int   set @postion = CHARINDEX(@sub_string, @source_string)    set @count = 0    while @postion > 0    begin     set @count = @count + 1      if @count = @nth      begin       break      end     set @postion = CHARINDEX(@sub_string, @source_string, @postion + 1)    End   return @postion  end GO --select dbo.NthChar('abcabc','abc',2) --42. 通过CTE,对待处理的整个表字段操作, 递归中每次为charindex加一个计数,直到为Nif object_id('tempdb..#T') is not null   drop table #T create table #T ( source_string nvarchar(4000) ) insert into #T values (N'我们我们') insert into #T values (N'我我哦我') declare @sub_string nvarchar(1024) declare @nth    int set @sub_string = N'我们' set @nth = 2 ;with T(source_string, starts, pos, nth)  as (   select source_string, 1, charindex(@sub_string, source_string), 1 from #t   union all   select source_string, pos + 1, charindex(@sub_string, source_string, pos + 1), nth+1 from T   where pos > 0 ) select   source_string, pos, nth from T where pos <> 0  and nth = @nth order by source_string, starts --source_string  pos  nth --我们我们  3  23. 借助数字表 (tally table),到不同起点位置去做charindex,需要先自己构造个数字表--numbers/tally table IF EXISTS (select * from dbo.sysobjects where id = object_id(N'[dbo].[Numbers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)   DROP TABLE dbo.Numbers --===== Create and populate the Tally table on the fly  SELECT TOP 1000000      IDENTITY(int,1,1) AS number   INTO dbo.Numbers   FROM master.dbo.syscolumns sc1,     master.dbo.syscolumns sc2 --===== Add a Primary Key to maximize performance  ALTER TABLE dbo.Numbers     ADD CONSTRAINT PK_numbers_number PRIMARY KEY CLUSTERED (number) --===== Allow the general public to use it  GRANT SELECT ON dbo.Numbers TO PUBLIC --以上数字表创建一次即可,不需要每次都重复创建 DECLARE @source_string  nvarchar(4000),      @sub_string    nvarchar(1024),      @nth       int SET @source_string = 'abcabcvvvvabc' SET @sub_string = 'abc' SET @nth = 2  ;WITH T  AS (       SELECT ROW_NUMBER() OVER(ORDER BY number) AS nth,     number AS [Position In String]  FROM dbo.Numbers n   WHERE n.number <= LEN(@source_string)     AND CHARINDEX(@sub_string, @source_string, n.number)-number = 0   ----OR   --AND SUBSTRING(@source_string,number,LEN(@sub_string)) = @sub_string )  SELECT * FROM T WHERE nth = @nth4. 通过CROSS APPLY结合charindex,适用于N值较小的时候,因为CROSS APPLY的次数要随着N的变大而增加,语句也要做相应的修改declare @T table ( source_string nvarchar(4000) )   insert into @T values ('abcabc'), ('abcabcvvvvabc') declare @sub_string nvarchar(1024) set @sub_string = 'abc'   select source_string,     p1.pos as no1,     p2.pos as no2,     p3.pos as no3 from @T cross apply (select (charindex(@sub_string, source_string))) as P1(Pos) cross apply (select (charindex(@sub_string, source_string, P1.Pos+1))) as P2(Pos) cross apply (select (charindex(@sub_string, source_string, P2.Pos+1))) as P3(Pos)5. 在SSIS里有内置的函数,但T-SQL中并没有--FINDSTRING in SQL Server 2005 SSIS FINDSTRING([yourColumn], "|", 2), --TOKEN in SQL Server 2012 SSIS TOKEN(Col1,"|",3)注:不难发现,这些方法和字符串拆分的逻辑是类似的,只不过一个是定位,一个是截取,如果要获取第N个字符左右的一个/多个字符,有了N的位置,再结合substring去截取即可;三. 多个相同字符连续,合并为一个字符最常见的就是把多个连续的空格合并为一个空格,解决思路有两个:1. 比较容易想到的就是用多个replace但是究竟需要replace多少次并不确定,所以还得循环多次才行--把两个连续空格替换成一个空格,然后循环,直到charindex检查不到两个连续空格 declare @str varchar(100) set @str='abc    abc   kljlk   kljkl' while(charindex(' ',@str)>0) begin   select @str=replace(@str,' ',' ') end select @str2. 按照空格把字符串拆开对每一段拆分开的字符串trim或者replace后,再用一个空格连接,有点繁琐,没写代码示例,如何拆分字符串可参考:“第N次出现的位置”;四. 是否为有效IP/身份证号/手机号等类似IP/身份证号/手机号等这些字符串,往往都有自身特定的规律,通过substring去逐位或逐段判断是可以的,但SQL语句的方式往往性能不佳,建议尝试正则函数,见下。五. 正则表达式函数1. Oracle从10g开始,可以在查询中使用正则表达式,它通过一些支持正则表达式的函数来实现:Oracle 10 g REGEXP_LIKE REGEXP_REPLACE REGEXP_INSTR REGEXP_SUBSTR Oracle 11g (新增) REGEXP_COUNTOracle用REGEXP函数处理上面几个问题:(1) 同一个字符/字符串,出现了多少次select length(regexp_replace('123-345-566', '[^-]', '')) from dual; select REGEXP_COUNT('123-345-566', '-') from dual; --Oracle 11g(2) 同一个字符/字符串,第N次出现的位置不需要正则,ORACLE的instr可以直接查找位置:instr('source_string','sub_string' [,n][,m])n表示从第n个字符开始搜索,缺省值为1,m表示第m次出现,缺省值为1select instr('abcdefghijkabc','abc', 1, 2) position from dual;(3) 多个相同字符连续,合并为一个字符select regexp_replace(trim('agc f  f '),'\s+',' ') from dual;(4) 是否为有效IP/身份证号/手机号等--是否为有效IP WITH IP AS( SELECT '10.20.30.40' ip_address FROM dual UNION ALL SELECT 'a.b.c.d' ip_address FROM dual UNION ALL SELECT '256.123.0.254' ip_address FROM dual UNION ALL SELECT '255.255.255.255' ip_address FROM dual ) SELECT * FROM IP WHERE REGEXP_LIKE(ip_address, '^(([0-9]{1}|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1}|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$'); --是否为有效身份证/手机号,暂未举例
  • [技术干货] 【转载】JavaScript中的正则表达式详解
    摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法。正则表达式(Regular Expression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。正则表达式在人们的印象中可能是一堆无法理解的字符,但就是这些符号却实现了字符串的高效操作。javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法。正则表达式的概念:官方:正则表达式(regular expression)是一个描述字符模式的对象。 ECMAScript 的RegExp类表示正则表达式,而String和正则表达式都定义了进行强大的【模式匹配】和【文本检索】与【替换】的函数。本人理解:功能和字符串类似,但是比字符串强大,更像是服务字符串的,例如表单验证创建正则表达式:1.通过new关键字声明var reg=new RegExp("hello","ig")【注】 第一个参数为正则表达式的主体,是字符串型,第二个参数为修饰符 i 和 gi的作用是忽略大小写,g的作用是全局匹配,在书写的时候,它们两个前后顺序没有区别。2.省略new关键字声明var reg=new RegExp("hello","ig");3.通过正则表达式的声明规则直接赋值var reg=/hello/ig;正则表达式的方法:正则表达式对象只有两个方法text方法: 正则表达式.text(字符串) 在字符串中匹配这个正则表达式是否存在如果匹配成功返回true,匹配失败返回false。exec方法:正则表达式.exec(字符串) 在字符串中匹配这个正则表达式是否存在,匹配成功,返回一个装有字符串的数组,匹配失败返回null正则表达式的更多功能体现在元字符元字符的概念:在正则表达式中有特殊含义的字符【注】 . 匹配单个的任意字符; []匹配单个在范围内的字符;[^] 匹配单个不在范围内的字符。【注】x{n} 必须匹配n个x【注】只需要了解前两个,^ 行首匹配 必须以这个正则开头$ 行尾匹配 必须以这个正则结尾以上常见的元字符,我从别的地方获取的表格资源,但是最重要的还是练习!!下面让我们一起简单练习几个常见的吧!var str="google"; var reg=/google/; reg.text(str); //true用 . 的 形式var str="goggle"; var reg=/go.gle/; reg.text(str);//true .对应的单个字符为任意用[] 的形式var str="go2gle"; var reg=/go[0-9]gle/; reg.text(str);//true []对应的字符必须符合[]中的范围,否则为false用x? 的形式var str="gogle"; var str1="google"; var reg=/goo?gle/; reg.text(str);//true reg.text(str1);//true 0? 代表可以有0个O或者1个O,用 x+ 的形式var str="google"; var str1="googe";ar reg=/googl+e/; reg.text(str);//true reg.text(str1);//false l+ 代表至少存在一个l用 ^ 的形式var str="I am Li"; var str1="you are Li"; ar reg=/^you/; reg.text(str);//false reg.text(str1)//true 字符串必须以you开头精力有限,希望大家下去后,把所以元字符练习一遍,加深印象。前面说到正则表达式是方便字符串的,那么我们今天在这里也简单罗列一下字符串中用到正则表达式的方法在字符串中使用正则表达式的方法:match() : 字符串.match(正则表达式) 在字符串中匹配,是否有符合正则表达式,匹配成功,返回一个装有子串的数组,匹配失败,返回nullreplace() : 字符串.replace(oldStr,newStr) 用newStr将oldStr替换,返回替换成功的新字符串【注】乍一看和正则没有关系,但是oldStr可以用正则表达式的形式。split() : 字符串.split(分隔符) 用分隔符将原字符串进行分割,返回剩下的子串组成的数组。【注】分隔符一般为字符串,也可以为正则表达式。search(): 字符串.search(子串) 找到复合条件的子串第一次出现的位置,如果找到,返回第一次出现子串的位置,并且为子串的首元素位置,否则返回-1。
  • [技术干货] 【转载】JavaScript基础之正则表达式
    【转载华为云社区】链接:https://bbs.huaweicloud.com/blogs/193085正则表达式的概念:官方:正则表达式(regular expression)是一个描述字符模式的对象。 ECMAScript 的 RegExp类表示正则表达式,而String和正则表达式都定义了进行强大的【模式匹配】和【文本检索】与【替换】的函数。本人理解:功能和字符串类似,但是比字符串强大,更像是服务字符串的,例如表单验证创建正则表达式:   1.通过new关键字声明  var  reg=new RegExp("hello","ig")【注】 第一个参数为正则表达式的主体,是字符串型,第二个参数为修饰符 i 和 g   i的作用是忽略大小写,g的作用是全局匹配,在书写的时候,它们两个前后顺序没有区别。   2.省略new关键字声明 var reg=new RegExp("hello","ig");  3.通过正则表达式的声明规则直接赋值   var reg=/hello/ig;正则表达式的方法:正则表达式对象只有两个方法    text方法: 正则表达式.text(字符串)  在字符串中匹配这个正则表达式是否存在如果匹配成功返回true,匹配失败返回false。    exec方法:正则表达式.exec(字符串) 在字符串中匹配这个正则表达式是否存在,匹配成功,返回一个装有字符串的数组,匹配失败返回null正则表达式的更多功能体现在元字符元字符的概念:在正则表达式中有特殊含义的字符【注】 .   匹配单个的任意字符; []匹配单个在范围内的字符;[^] 匹配单个不在范围内的字符。【注】x{n} 必须匹配n个x【注】只需要了解前两个,^ 行首匹配  必须以这个正则开头$ 行尾匹配    必须以这个正则结尾以上常见的元字符,我从别的地方获取的表格资源,但是最重要的还是练习!!下面让我们一起简单练习几个常见的吧! var str="google"; var reg=/google/; reg.text(str); //true  用 . 的 形式 var str="goggle"; var reg=/go.gle/; reg.text(str);//true     .对应的单个字符为任意  用[] 的形式 var str="go2gle"; var reg=/go[0-9]gle/; reg.text(str);//true   []对应的字符必须符合[]中的范围,否则为false 用x? 的形式 var str="gogle"; var str1="google";  var reg=/goo?gle/;  reg.text(str);//true  reg.text(str1);//true   0? 代表可以有0个O或者1个O, 用 x+ 的形式 var str="google"; var str1="googe";ar reg=/googl+e/;  reg.text(str);//true  reg.text(str1);//false    l+ 代表至少存在一个l用 ^ 的形式 var str="I am Li"; var str1="you are Li"; ar reg=/^you/; reg.text(str);//false  reg.text(str1)//true  字符串必须以you开头 精力有限,希望大家下去后,把所以元字符练习一遍,加深印象。前面说到正则表达式是方便字符串的,那么我们今天在这里也简单罗列一下字符串中用到正则表达式的方法在字符串中使用正则表达式的方法:   match()  :  字符串.match(正则表达式)  在字符串中匹配,是否有符合正则表达式,匹配成功,返回一个装有子串的数组,匹配失败,返回null  replace()  :   字符串.replace(oldStr,newStr)    用newStr将oldStr替换,返回替换成功的新字符串   【注】乍一看和正则没有关系,但是oldStr可以用正则表达式的形式。 split() :    字符串.split(分隔符)  用分隔符将原字符串进行分割,返回剩下的子串组成的数组。【注】分隔符一般为字符串,也可以为正则表达式。search():   字符串.search(子串)      找到复合条件的子串第一次出现的位置,如果找到,返回第一次出现子串的位置,并且为子串的首元素位置,否则返回-1。
  • [技术干货] 正则表达式
    正则表达式 - 语法正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。例如:runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
  • [技术干货] 5 分钟搞定 Linux 正则表达式
  • [其他语言] 【华为云鲲鹏云服务最佳实践】【语言篇】第011期 Pcre-8.32 安装配置指南
    1、简介PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式)是一个用C语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE是一个轻量级的函数库,比Boost之类的正则表达式库小得多。PCRE十分易用,同时功能也很强大,性能超过了POSIX正则表达式库和一些经典的正则表达式库。官方链接:http://www.pcre.org/类别:函数库2、基础环境类别子项版本获取地址(方法)华为云华为云虚拟机RC3(916)--OSCentOS7.5Kernel4.14软件包Pcre8.323、依赖安装无4、组件编译安装清除yumyum clean all下载服务器包到本地缓存yum makecache更新yum 包yum -y update    安装pcreyum -y install pcre5、系统配置无6、测试测试内容:查看pcre库是否安装成功rpm -ql pcre测试结果:安装成功 7、参考信息官方文档:http://www.pcre.org/current/doc/html/8、FAQ无
  • [技术干货] mongodb 查询命令及参数详解(1)
    本帖最后由 Nosql_newbee 于 2018-4-2 08:53 编辑 本文将详细介绍mongodb查询相关命令,参数,主要包括以下几个方面: 用find或者findone函数查询; $条件查询; 特定类型的查询。 首先**测试数据 db.user.insert([{"username":"test01","email":"test@01","age":10},{"username":"test02","email":"test@02","age":20},{"username":"test03","email":"test@03","age":30},{"username":"test04","email":"test@04","age":40}]) 使用find进行查询,返回一个集合中文档的子集,子集的范围从0个文档到整个集合; db.user.find(query, projection) 第一个参数是查询条件(可选),第二个参数是定义哪些信息需要返回(可选)。当参数为空时指查询集合中的所有文档: db.user.find() 查询简单的类型,只要指定想要查询的值就可以了,例如要查询collection 集合中username 为test的所有文档: db.user.find({"username":"test01"}) 有时并不需要将文档中的所有值返回,指定其中某些字段进行返回,例如要查询collection集合中用户的email: db.user.find({},{"email":1}) email的值为boolen类型,true为只返回该字段,fasle为返回除该字段的其他值,"_id"默认被返回,如果不想返回"_id" db.user.find({},{"_id":0}) 查询条件: "$lt","$lte","$gt","$gte"就是全部的比较操作符,分别对应.=,>,>=。例如查询age大于20的文档 db.user.find({"age":{"$gt":20}}), 支持多个条件与, db.user.find({"age":{"$gt":20,"$lt":40}}) 或查询: mongodb支持两种or查询方式:"$in"可以用来查询一个键的多个值,"$or"更通用些。 如果你个键需要与多个值进行匹配的话,就要用$in操作符,例如查找age为20,30,40的所有文档 db.user.find({"age":{"$in":[20,30,40]}}) $in 的匹配值中可以指定不同的类型,$nin 返回与数组中所有条件都不匹配的文档,例如,查找username为非test01的文档 db.user.find({"username":{"$nin":["test01"]}}) $in只能对单键尽心查询,要查询username为test01 或者age为30的文档,就需要用$or $or接受一个包含所有可能条件的数组作为参数,例如上面的例子可以写成: db.user.find({"$or":[{"username":"test01"},{"age":30}]}) $not $not是元条件句,即可以用在任何其他条件之上,用$not可以实现$nin的效果 db.user.find({"age":{$not:{$in:[20,30]}}}) 特定类型的查询: NULL: null类型有点奇怪,他确实可以与自身匹配,所以要是有个包含null的文档集合,通过查询语句可以查到。但是,null还会匹配不包含这个键的文档,例如查询没有address键值的文档 db.user.find({"adress":null}) 如果仅想匹配键值为null的文档,既要检查该键的值是否存在还要通过$exist条件判断该键值已存在 db.user.find({"address":{"$in":[null],"$exist":true}}) 这里对null的匹配并没有类似$eq的语句,使用$in效果一样的 正则表达式: 正则表达式可以灵活的匹配字符串,例如,要想查找username为test开头的文档 db.user.find({"username":/test/i}) MongDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式,任何PCRE支持的正则表达式语法都能被mongoDB接受,建议在查询使用正则表达式前,先在JavaScript shell中检查下语法,确保结果是你想要的。
总条数:54 到第
上滑加载中