当前位置:17727 > 操作系统 > Linux正则表达式,awk常用正则表达式

Linux正则表达式,awk常用正则表达式

文章作者:操作系统 上传时间:2019-08-31

Linux正则表达式-POSIX字符类

POSIX标准对正则表达式字符和操作符的含义进行了形式化。这种标准定义了两类正则表达式:基本的正则表达式(BRE) , grep和sed使用这种正则表达式;扩展的正则表达式,egrep和awk使用这种正则表达式。

为了适应非英文的环境, POSIX标准增强了匹配不在英文字母表中的字符的字符类的功能。例如,法文è是一个字母字符,但是使用典型的字符类[a-z]不匹配它。该标准提供了附加的字母序列,当匹配和整理(排序)字符串数据时,这些字符序列应该被作为单个单元看待。

POSIX还改变了常用的术语,我们一直称为"字符类"的东西在POSIX标准中称为"括号表达式"。在括号表达式中,除了字符(例如a,!等等)以外,还可以由其他标记。如下:
? 字符类。由[:和:]包围的关键字组成的POSIX字符类。关键字描述了不同的字符类,例如,文字字符,控制字符等等。
? 整理符合。整理符合是多字符的序列。表示这些字符应该被看做是一个单元,它由[,和.]包围的字符组成。
? 等价类。等价类列出了应该看做是等价的字符集,例如e和è。它由地区化的字符元素(由[=和=]包围)组成。

所有的这3种结果都必须出现在括号表达式的方括号中。例如[[: alpha :]!]匹配任意单个字母字符或感叹号, [[.ch.]]匹配整理元素ch,但不只匹配字母c或字母h。在法语地区中, [[=e=]] 可以匹配任意e、è或é。下表列出了类及其匹配字符。

括号类 含义
[:alnum:] 字母数字字符
[:alpha:] 字母字符
[:cntrl:] 控制字符
[:digit:] 数字字符
[:graph:] 非空白字符(非空格、控制字符等)
[:lower:] 小写字母
[:print:] 与[:graph:]相似,但是包含空格字符
[:punct:] 标点字符
[:space:] 所有的空白字符(换行符、空格、制表符)
[:upper:] 大写字母
[:xdigit:] 允许十六进制的数字(0-9a-fA-F)

 

当厂商完全实现了POSIX标准时,这些特征逐渐向sed和awk的商业版接近。GNU awk和GNU sed支持字符类符号,但不支持另外两个括号符号。可以检查本地系统文档来查看它们是否可用。

因为这些特征还不能被广泛地应用,本站的脚本不依赖它们,而且我们要继续使用术语"字符类"来表示方括号中的字符表。

POSIX标准对正则表达式字符和操作符的含义进行了形式化。这种标准定义了两类正则表达式:基本的正则表达式...

正则表达式元字符

正则表达式中有两种基本元素:

  1. 以字面值或变量表示的值(如.代表任意单个字符)。

  2. 操作符(如*代表将前面的字符重复任意次)。

元字符汇总

特殊字符

用途

.

匹配除换行符以外的任意单个字符。在awk中,句点也能匹配换行符。

*

匹配任意一个(包括零个)在它面前的字符(包括由正则表达式指定的字符)

[…]

匹配方括号中的字符类中的任意一个。如果方括号中第一个字符为脱字符号(^),则表示否定匹配,即匹配出了换行符和类中列出的哪些字符以外的所有字符。在awk中,也匹配换行符。连字符(-)用于表示字符的范围。如果类中的第一个字符为右方括号(])则表示它是类的成员。所有其他的元字符在被指定为类中成员时都会失去它们原来的含义。

^

如果作为正则表达式的第一个字符,则表示匹配行的开始。在awk中匹配字符串的开始,即使字符串包含嵌入的换行符。

$

如果作为正则表达式的最后一个字符,则表示匹配行的结尾。在awk中匹配字符串的结尾,即使字符串包含嵌入的换行符。

{n,m}

匹配它前面某个范围内单个字符出现的次数(包括由正则表达式指定的字符)。{n,m}将匹配n次出现,{n,}至少匹配n次出现,而且{n,m}匹配n和m之间的任意次出现。

转意随后的特殊字符。

匹配前面的正则表达式的一次或多次出现。

?

匹配前面的正则表达式的零次或一次出现。

|

指定可以匹配其前面的或后面的正则表达式。

()

对正则表达式分组

{n,m}

匹配它前面某个范围内单个字符出现的次数(包括由正则表达式指定的字符)。{n}表示匹配n次出现,{n,}表示至少匹配n次出现,{n,m}匹配n和m之间的任意次出现。

正则表达式元字符

正则表达式中有两种基本元素:

正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。我将一些常用的表达式收藏在这里,作备忘之用。本贴随时会更新。

普遍存在的反斜杠

元字符反斜杠(/)将元字符转换成普通字符(或将普通字符转换成元字符)。它强制将任意元字符解释为普通字符,一边匹配该字符本身。

在sed中,使用反斜杠将一组普通字符转意为元字符。

如 () {} n

普遍存在的反斜杠

元字符反斜杠(/)将元字符转换成普通字符(或将普通字符转换成元字符)。它强制将任意元字符解释为普通字符,一边匹配该字符本身。

在sed中,使用反斜杠将一组普通字符转意为元字符。

如 () {} n

匹配中文字符的正则表达式:

字符类

字符类是对通配符概念的改进。我们可以列出要匹配的字符,而不是匹配特殊位置的任意字符。使用方括号元字符([])将字符列表括起来,其中每个字符占据一个位置。

注意:在方括号中元字符会失去它们的含义。

如[Ww]hat可以匹配what或者What

字符类中的的特殊字符:

字符

功能

转义任意特殊字符(只用于awk中)

-

当它不再第一个或最后一个位置时,表示一个范围。

^

仅当在第一个位置时表示反转匹配。

反斜杠只在awk中是特殊的,因此可以使用字符类"[a]1]"以匹配一个a、一个]或一个1。

 

如果闭括号(])是作为类中的第一个字符出现(或者是脱字符后的第一个字符),那么它就被解释为类的一个成员。如果连字符在一个类中是第一个或最后一个字符,则失去其特殊含义。因此,为了匹配算术操作符,我们在下面的实例中将连字符(-)放在第一位:

        [- */]

使用正则表达式匹配下面的日期,该日期可能有下面两种格式:

MM-DD-YY

MM/DD/YY

下面的正则表达式指示每个字符位置可能的树枝范围:

        [0-9][0-9][-/][0-3][0-9][-/][0-9][0-9]

"-"或"/"都可能是定界符。在第一个位置防止连字符确保它在字符类中解释为字面意义,即作为一个连字符,而不是指示一个范围。

字符类

字符类是对通配符概念的改进。我们可以列出要匹配的字符,而不是匹配特殊位置的任意字符。使用方括号元字符([])将字符列表括起来,其中每个字符占据一个位置。

注意:在方括号中元字符会失去它们的含义。

如[Ww]hat可以匹配what或者What

字符类中的的特殊字符:

反斜杠只在awk中是特殊的,因此可以使用字符类"[a]1]"以匹配一个a、一个]或一个1。

 

如果闭括号(])是作为类中的第一个字符出现(或者是脱字符后的第一个字符),那么它就被解释为类的一个成员。如果连字符在一个类中是第一个或最后一个字符,则失去其特殊含义。因此,为了匹配算术操作符,我们在下面的实例中将连字符(-)放在第一位:

        [- */]

使用正则表达式匹配下面的日期,该日期可能有下面两种格式:

MM-DD-YY

MM/DD/YY

下面的正则表达式指示每个字符位置可能的树枝范围:

        [0-9][0-9][-/][0-3][0-9][-/][0-9][0-9]

"-"或"/"都可能是定界符。在第一个位置防止连字符确保它在字符类中解释为字面意义,即作为一个连字符,而不是指示一个范围。

[u4e00-u9fa5]
匹配双字节字符(包括汉字在内):

排除字符类

通常,字符类包括在哪个位置想要匹配的所有字符。在类中作为第一个字符的脱字符(^)将类中所有字符都排除在被匹配之外。相反,除换行符以外没有在列的方括号中的任意字符都将被匹配。

下面的模式将匹配任意非数字字符:

    [^0-9]

它匹配字面表中所有的大写和小写字面以及所有特殊字符,例如标点符号。

排除字符类

通常,字符类包括在哪个位置想要匹配的所有字符。在类中作为第一个字符的脱字符(^)将类中所有字符都排除在被匹配之外。相反,除换行符以外没有在列的方括号中的任意字符都将被匹配。

下面的模式将匹配任意非数字字符:

    [^0-9]

它匹配字面表中所有的大写和小写字面以及所有特殊字符,例如标点符号。

[^x00-xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

POSIX字符类补充

POSIX标准对正则表达式字符和操作符的含义进行了形式化。这种标准定义了两类正则表达式:基本的正则表达式(BRE),grep和sed使用这种正则表达式;扩展的正则表达式,egrep和awk使用这种正则表达式。

POSIX还改变了常用的属于,我们一直成为"字符类"的东西在POSIX标准中成为"括号表达式"。在括号表达式中,出了字面字符(例如a, !等)以外,还可以由其他标记。如:

  • 字符类。由[:和:]包围的关键字组成的POSIX字符类。关键字描述了不同的字符类,如文字字符类,控制字符等等。

  • 整理复合。整理复合是多字符的序列。表示这些字符应该被看作是一个单元,它由[,和.]包围的字符组成。

  • 等价类。等价类列出了应该看作是等价的字符集,它由地区化的字符元素(有[=和=]包围)组成。

所有这3种结果都必须出现在括号表达式的方括号中。例如[[:alpha:]!]匹配任意单个字幕字符或感叹号,[[.ch.]]匹配整理元素ch,但不止匹配字幕c或字幕h。

POSIX字符类:

[:alnum:]

可打印的字符(包括空白字符)

[:alpha:]

字母字符

[:blank:]

空格和制表符

[:cntrl:]

控制字符

[:digit:]

数字字符

[:graph:]

可打印和可见的(非空格)字符

[:lower:]

小写字符

[:print:]

可打印的字符(包括空包字符)

[:punct:]

标点符号字符

[:space:]

空白字符

[:upper:]

大写字符

[:xdigit:]

十六进制数字

POSIX字符类补充

POSIX标准对正则表达式字符和操作符的含义进行了形式化。这种标准定义了两类正则表达式:基本的正则表达式(BRE),grep和sed使用这种正则表达式;扩展的正则表达式,egrep和awk使用这种正则表达式。

POSIX还改变了常用的属于,我们一直成为"字符类"的东西在POSIX标准中成为"括号表达式"。在括号表达式中,出了字面字符(例如a, !等)以外,还可以由其他标记。如:

String.prototype.len=function(){ return this.replace([^x00-xff]/g,"aa").length; }
匹配空行的正则表达式:

定位元字符

有两个元字符用于指定字符串出现在行首或行末的上下文。脱字符^表示行开始,$表示行结束。

可以使用两个联系的定位元字符来匹配空行,即:

    ^$

可以使用这种模式计算文件中的空行数,在grep中使用计数选项-c:

    # grep –c '^$' ch04

    5

如果想使用sed来删除空行,那么这个正则表达式很有用。下面的正则表达式可以用于匹配空行,即使其中包含空格:

    ^□*$

同样,可以使用以下表达式匹配整个行:

    ^.*$

在sed(和grep)中,只有当"^"和"$"分别出现在正则表达式的开始或结尾才是特殊的。因此"^abc" 意味着 "匹配只处于行开始处的字母a、b和c",而"ab^c"以为着"匹配处于行的任意位置的a、b、字面意义的^,然后是c"。这对于"$"同样适用。

 

在awk中则不同,"^"和"$"总是特殊的,即使它们可能使编写的正则表达式不匹配任何东西。可以说,在awk中,当想要匹配字面"^"或"$"时,不管它处于正则表达式的什么位置都应该使用反斜杠对其进行转义。

-

所有这3种结果都必须出现在括号表达式的方括号中。例如[[:alpha:]!]匹配任意单个字幕字符或感叹号,[[.ch.]]匹配整理元素ch,但不止匹配字幕c或字幕h。

POSIX字符类:

n[s|]*r
匹配HTML标记的正则表达式:

字符的跨度

在grep和sed中使用{和}。POSIX egrep 和 POSIX awk使用{和}。在任何情况下,大括号包围一个或两个参数。

    {n,m}

n和m是0到255之间的整数。如果只指定{n}本身,那么将精确匹配前面的字符或正则表达式的n次出现。如果指定{n,m},那么就匹配出现的次数为n和m之间的任意次数。

定位元字符

有两个元字符用于指定字符串出现在行首或行末的上下文。脱字符^表示行开始,$表示行结束。

可以使用两个联系的定位元字符来匹配空行,即:

    ^$

可以使用这种模式计算文件中的空行数,在grep中使用计数选项-c:

    # grep –c '^$' ch04

    5

如果想使用sed来删除空行,那么这个正则表达式很有用。下面的正则表达式可以用于匹配空行,即使其中包含空格:

    ^*$

同样,可以使用以下表达式匹配整个行:

    ^.*$

在sed(和grep)中,只有当"^"和"$"分别出现在正则表达式的开始或结尾才是特殊的。因此"^abc" 意味着 "匹配只处于行开始处的字母a、b和c",而"ab^c"以为着"匹配处于行的任意位置的a、b、字面意义的^,然后是c"。这对于"$"同样适用。

 

在awk中则不同,"^"和"$"总是特殊的,即使它们可能使编写的正则表达式不匹配任何东西。可以说,在awk中,当想要匹配字面"^"或"$"时,不管它处于正则表达式的什么位置都应该使用反斜杠对其进行转义。

/<(.*)>.*</1>|<(.*) />/
匹配首尾空格的正则表达式:

选择性操作

竖线(|)元字符是元字符扩展集的一部分,用于指定正则表达式的联合。如果某行匹配其中的一个正则表达式,那么它就匹配该模式。

字符的跨度

在grep和sed中使用{和}。POSIX egrep 和 POSIX awk使用{和}。在任何情况下,大括号包围一个或两个参数。

    {n,m}

n和m是0到255之间的整数。如果只指定{n}本身,那么将精确匹配前面的字符或正则表达式的n次出现。如果指定{n,m},那么就匹配出现的次数为n和m之间的任意次数。

(^s*)|(s*$)
应用:j avascript中没有像v bscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

分组操作

圆括号()用于对正则表达式进行分组并设置优先级。它们是元字符扩展集的一部分。假设在文本文件中将公司的名称为"BigOne"或"BigOneComputer",使用正则表达式:

    BigOne(Computer)?

将匹配字符串"BigOne"本身或者后面跟有一个字符串"□Computer"的形式。同样,有些属于有时会用全拼,有时会用缩写、则可以使用:

    # egrep "Lab(oratorie)?s" mail.list

    Bell Laboratories, Lucent Technologies

    Bell Labs

可以用竖线和圆括号来对选择性操作进行分组。在下面的示例中,使用它来指定单词"company"的单数或复数匹配。

    compan(y|ies)

注意:大多数sed和grep 的版本中不能对加圆括号的一组字符应用数量词,但是在egrep和awk的所有版本都是可以的。

选择性操作

竖线(|)元字符是元字符扩展集的一部分,用于指定正则表达式的联合。如果某行匹配其中的一个正则表达式,那么它就匹配该模式。

String.prototype.trim = function()
{
    return this.replace(/(^s*)|(s*$)/g, "");
}
利用正则表达式分解和转换IP地址
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

限制范围

一个正则表达式为:

    A.*Z

匹配的结果为

All of us, including Zippy, our dog

All of us, including Zippy and Ziggy

All of us, including Zippy and Ziggy and Zelda

下划线的字符串表示匹配的字符串,即.*在每种情况下都会匹配可能的最长的范围。

 

正则表达式尝试匹配最长的字符串,这可能会引起意想不到的问题。例如,下面的正则表达式与引号中的任意个字符匹配:

    ".*"

输入字符串为:

    .Se "Appendix" "Full Progarm Listings."

要匹配第一个参数,可以用下面的正则表达式来描述:

    .Se ".*"

然而,因为模式中的第二个引号与该行上的最后一个引号匹配,所以它结束匹配整个行。如果知道参数的个数,那么可以对每个进行说明:

    .Se ".*" ".*"

虽然这种方法可以像期望的那样工作,但是每行也许不会有相同书目的参数,省略你只想要第一个参数。这里有一个匹配两个引号之间最短范围的正则表达式:

    "[^ "]*"

它匹配引号并且后面跟有任意个字符的情况,但它不匹配引号后面跟有引号的情况。

分组操作

圆括号()用于对正则表达式进行分组并设置优先级。它们是元字符扩展集的一部分。假设在文本文件中将公司的名称为"BigOne"或"BigOneComputer",使用正则表达式:

    BigOne(Computer)?

将匹配字符串"BigOne"本身或者后面跟有一个字符串"Computer"的形式。同样,有些属于有时会用全拼,有时会用缩写、则可以使用:

    # egrep "Lab(oratorie)?s" mail.list

    Bell Laboratories, Lucent Technologies

    Bell Labs

可以用竖线和圆括号来对选择性操作进行分组。在下面的示例中,使用它来指定单词"company"的单数或复数匹配。

    compan(y|ies)

注意:大多数sed和grep 的版本中不能对加圆括号的一组字符应用数量词,但是在egrep和awk的所有版本都是可以的。

function IP2V(ip)
{
    re=/(d ).(d ).(d ).(d )/g  //匹配IP地址的正则表达式
    if(re.test(ip))
    {
        return RegExp.$1*Math.pow(255,3)) RegExp.$2*Math.pow(255,2)) RegExp.$3*255 RegExp.$4*1
    }
    else
    {
        throw new Error("Not a valid IP address!")
    }
}
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

其他一些正则

国家的缩写

□[A-Z][A-Z]□

HTML代码

<[^ >]*>

匹配空行

^$

匹配整行

^.*$

匹配一个或多个空格(空内容的行)

□□*


限制范围

一个正则表达式为:

    A.*Z

匹配的结果为

ippy, our dog

iggy

elda

下划线的字符串表示匹配的字符串,即.*在每种情况下都会匹配可能的最长的范围。

 

正则表达式尝试匹配最长的字符串,这可能会引起意想不到的问题。例如,下面的正则表达式与引号中的任意个字符匹配:

    ".*"

输入字符串为:

    .Se "Appendix" "Full Progarm Listings."

要匹配第一个参数,可以用下面的正则表达式来描述:

    .Se ".*"

然而,因为模式中的第二个引号与该行上的最后一个引号匹配,所以它结束匹配整个行。如果知道参数的个数,那么可以对每个进行说明:

    .Se ".*" ".*"

虽然这种方法可以像期望的那样工作,但是每行也许不会有相同书目的参数,省略你只想要第一个参数。这里有一个匹配两个引号之间最短范围的正则表达式:

    "[^ "]*"

它匹配引号并且后面跟有任意个字符的情况,但它不匹配引号后面跟有引号的情况。

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:" (ip[0]*255*255*255 ip[1]*255*255 ip[2]*255 ip[3]*1))
匹配Email地址的正则表达式:

其他一些正则

正则表达式中有两种基本元素: 普遍存在的反斜杠 元字符反斜杠(/)将元字符转换成普通字符(或将普通字符转换成元...

w ([- .]w )*@w ([-.]w )*.w ([-.]w )*
匹配网址URL的正则表达式:

./?%&=]*)?
利用正则表达式去除字串中重复的字符的算法程序:[*注:此程序不正确]

var s="abacabefgeeii"
var s1=s.replace(/(.).*1/g,"$1")
var re=new RegExp("[" s1 "]","g")
var s2=s.replace(re,"")
alert(s1 s2)  //结果为:abcefgi

*注

如果var s = “abacabefggeeii”
结果就不对了,结果为:abeicfgg

正则表达式的能力有限

我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

s=""
s=s.replace(/(.*/){ 0, }([^.] ).*/ig,"$2")
alert(s)
利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:

onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
用正则表达式限制只能输入全角字符:

onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
用正则表达式限制只能输入数字:

onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
用正则表达式限制只能输入数字和英文:

onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
匹配非负整数(正整数 0)

^d $
匹配正整数

^[0-9]*[1-9][0-9]*$
匹配非正整数(负整数 0)

^((-d )|(0 ))$
匹配负整数

^-[0-9]*[1-9][0-9]*$
匹配整数

^-?d $
匹配非负浮点数(正浮点数 0)

^d (.d )?$
匹配正浮点数

^(([0-9] .[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9] )|([0-9]*[1-9][0-9]*))$
匹配非正浮点数(负浮点数 0)

^((-d (.d )?)|(0 (.0 )?))$
匹配负浮点数

^(-(([0-9] .[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9] )|([0-9]*[1-9][0-9]*)))$
匹配浮点数

^(-?d )(.d )?$
匹配由26个英文字母组成的字符串

^[A-Za-z] $
匹配由26个英文字母的大写组成的字符串

^[A-Z] $
匹配由26个英文字母的小写组成的字符串

^[a-z] $
匹配由数字和26个英文字母组成的字符串

^[A-Za-z0-9] $
匹配由数字、26个英文字母或者下划线组成的字符串

^w $
匹配email地址

^[w-] (.[w-] )*@[w-] (.[w-] ) $
匹配url

^[a-zA-z] ://匹配(w (-w )*)(.(w (-w )*))*(?S*)?$
匹配html tag

<s*(S )(s[^>]*)?>(.*?)<s*/1s*>
Visual Basic & C# Regular Expression
1.确认有效电子邮件格式
下面的示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 IsValidEmail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前,筛选出包含无效字符的电子邮件地址。

[Visual Basic]

Function IsValidEmail(strIn As String) As Boolean
' Return true if strIn is in valid e-mail format.
Return Regex.IsMatch(strIn, ("^([w-.] )@(([[0-9]{ 1,3 }.[0-9]{ 1,3 }.[0-9]{ 1,3 }.)|(([w-] .) ))([a-zA-Z]{ 2,4 }|[0-9]{ 1,3 })(]?)$")
End Function
[C#]

bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([w-.] )@(([[0-9]{ 1,3 }.[0-9]{ 1,3 }.[0-9]{ 1,3 }.)|(([w-] .) ))([a-zA-Z]{ 2,4 }|[0-9]{ 1,3 })(]?)$");
}
2.清理输入字符串
下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-(连字符)和 .(句点)以外的所有非字母数字字符后返回一个字符串。

[Visual Basic]

Function CleanInput(strIn As String) As String
' Replace invalid characters with empty strings.
Return Regex.Replace(strIn, "[^w.@-]", "")
End Function
[C#]

String CleanInput(string strIn)
{
    // Replace invalid characters with empty strings.
    return Regex.Replace(strIn, @"[^w.@-]", "");
}
3.更改日期格式
以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。

[Visual Basic]

Function MDYToDMY(input As String) As String
Return Regex.Replace(input, _
"b(?<month>d{ 1,2 })/(?<day>d{ 1,2 })/(?<year>d{ 2,4 })b", _
"${ day }-${ month }-${ year }")
End Function
[C#]

String MDYToDMY(String input)
{
    return Regex.Replace(input,"\b(?<month>\d{ 1,2 })/(?<day>\d{ 1,2 })/(?<year>\d{ 2,4 })\b","${ day }-${ month }-${ year }");
}
Regex 替换模式
本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达式 ${ day } 插入由 (?…) 组捕获的子字符串。

有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便

4.提取 URL 信息
以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如,“

[Visual Basic]

Function Extension(url As String) As String
Dim r As New Regex("^(?<proto>w )://[^/] ?(?<port>:d )?/", _
RegexOptions.Compiled)
Return r.Match(url).Result("${ proto }${ port }")
End Function
[C#]

String Extension(String url)
{
    Regex r = new Regex(@"^(?<proto>w )://[^/] ?(?<port>:d )?/",
    RegexOptions.Compiled);
    return r.Match(url).Result("${ proto }${ port }");
}
只有字母和数字,不小于6位,且数字字母都包含的密码的正则表达式
在C#中,可以用这个来表示:

"w{ 6 }(w )*"
一个将需要将路径字符串拆分为根目录和子目录两部分的算法程序,考虑路径格式有:C:aabbcc ,\aabbcc , ftp://aa.bb/cc 上述路径将分别被拆分为:C:和aabbcc ,\aa 和 bbcc , ftp:// 和 aa.bb/cc 用javascript实现如下:

var strRoot,strSub
var regPathParse=/^([^\^/] [\/] |\\[^\] )(.*)$/
if(regPathParse.test(strFolder))
{
    strRoot=RegExp.$1
    strSub=RegExp.$2
}
Posted by should at  2006-06-12 10:49:11 | Read More  |  Edit | Comments(0) | Trackback(0) 

正则表达式基本元素    -[多收了三五斗]
元字符:
.: 用于匹配除换行符以外的任意单个字符。在awk中,句点也能匹配换行符

* :用于与它前面的正则表达式的零个或多个出现匹配,该表达式通常是一个字符。在正则表达式中,*本身不匹配任何字符,.*匹配任意数目的字符;而shell中,*本身就具有这样的含义。

[...] :匹配方括号中的字符类中的任意一个。如果方括号中第一个字符为脱字符号(^),则表示否定匹配,即匹配除了换行符和类中列出的那些字符以外的所有字符。在awk中,也匹配换行符。连字符(-)用于表示字符的范围。如果类中的第一个字符为右方括号(])则表示它是类的成员。所有其他的元字符在被指定为类中的成员时都会失去它们原来的含义。

^: 如果作为正则表达式的第一个字符,则表示匹配行的开始。在awk中匹配字符串的开始,即使字符串包含嵌入的换行符。

$ :如果作为正则表达式的最后一个字符,则表示匹配行的结尾。在awk中匹配字符串的结尾,即使字符串包含嵌的换行符。

{n,m}: 匹配它前面某个范围内单个字符出现的次数(包括由正则表达式指定的字符)。{n}将匹配n次出现,{n,}至少匹配n次出现,而且{n,m}匹配n和m之间的任意次出现。

:转义随后的特殊字符

扩展的元字符(egrep, awk)

  • :匹配前面的正则表达式的一次或多次出现
    ? :匹配前面的正则表达式的零次或多次出现
    | :指定可以匹配其前面的或后面的正则表达式
    (): 对正则表达式分组
    {n,m}: 匹配它前面某个范围内单个字符出现的次数(包括由正则表达式指定的字符)。{n}表示匹配n次出现,{n,}至少匹配n次出现,{n,m}匹配n和m之间的任意次出现。(用于POSIX的egrep和POSIX的awk,而非传统的egrep和awk)

字符类[]的用法
其中的特殊字符:
  转移任意特殊字符(只用于awk中)
 - 不用在第一或最后一个位置时,表示范围
 ^ 仅当在第一个位置时表示反转匹配。将类中所有字符都排除在匹配之外,除换行符以外的没有列在方括号中的任意字符都将被匹配。
eg.
  [a-zA-Z][.?!]:匹配后面跟由句点、问号和感叹号的任意小写或大写字母
 
POSIX字符类补充:
 POSIX标准对正则表达式字符和操作符的含义进行了形式化。这种标准定义了两类正则表达式:
  基本正则表达式(grep,sed使用这种正则表达式)和扩展的正则表达式(egrep和awk使用)
 POSIX标准增强了匹配不在英文字母表中的字符的字符类的功能。
 POSIX标准中称“字符类”为“括号表达式”。在括号表达式中,除了有字面字符(如a,!等),还有其他标记:
  ·字符类:由[Linux正则表达式,awk常用正则表达式。:和:]包围的关键字组成的POSIX字符类。如:
      [:alnum:]    可打印的字符(包括空白字符)
      [:alpha:]     字母字符
  ·整理(collating)字符:整理符号是多字符的序列,表示这些字符应该被看成一个单元,由[.和.]包围的字符组成。
  ·等价类:等价类列出了应该看做是等价的字符集,例如英文的e和法文的e,它由地区化的字符元素组成。由[=和=]包围组成。
 
^和$在sed和grep中,只要不是出现在pattern的特殊位置,均不作特殊处理。而awk中,无论他们在什么位置,都被解释成特殊意义,除非用

后记:

      本想找找看如何匹配汉字,但从Linux下的grep和awk等工具的manual中看,似乎他们没有提供这样的功能。倒是搜到了javascript中如何匹配中文字符的正则表达式,ms其中使用的是字符编码来匹配的。看来,要写匹配中文的正则表达式,只能借助具体语言来看了


本文由17727发布于操作系统,转载请注明出处:Linux正则表达式,awk常用正则表达式

关键词: 17727.com