-
借住子表达式的帮助,你可以创建出更加惊人和灵活的正则表达式。例如,怎样定义一个网站中HTML标签的模式呢?一个标签通常包含同样的结构:<tagname [parameter]>…</tagname>,这就意味着可以快速定义出一个非常严格的HTML标签模式: 1 2 3 4 "<body background=1>www.pstips.net</body>" -match "<body\b[^>]*>(.*?)</body>" $matches[1] #True #www.pstips.net 模式以固定的文本”<body “开始,额外的字符以单词为界。接下来跟着右括号”>”,”>”之后则是中的内容,这些内容可以由任意数量的字符(.*?)组成。圆括号中是一个子表达式,会在$matches中返回检索到的中的结果。结尾的部分为固定文本 “”)开始,另外一次以(“”)终结。如果一个正则表达式支持处理任意标签,那它必须能够自动地找出所有的标签,并且在前后两个位置都能使用。怎样完成它呢?像这样: 1 2 3 4 5 6 7 8 9 10 "<body background=2>Contents</body>" -match "<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>" #True $Matches <# # Name Value # ---- ----- # 2 Contents # 1 body # 0 <body background=2>Contents</body> #> 上面的正则表达式不在包含预定义的固定HTMl 标签,却能匹配所有的HTML标签。它是如何办到的呢?因为初始标签被定义成子表达式,该子表达式以字母开始,可以由任意字母或数字组成。查看全部
-
每个子表达式检索的结果都需要存储空间,如果特定场合中不需要这些结果可以,可以丢弃它们,因为这样可以提高正则表达式匹配的速度。要丢弃结果,可以在子表达式中的第一个语句上加上“?:” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 第二个子表达式不返回结果: $pattern = "(?<Date>.*)\t(?:.*)" # 生成包含制表符的字符串: $line = "12/01/2009`tDescription" # 使用正则表达式匹配: $line -match $pattern #True # 第二个子表达式没有多余的结果返回 $matches <# # #Name Value #---- ----- #Date 12/01/2009 #0 12/01/2009 Description #>查看全部
-
当使用子表达式时,$matches会包含所有搜索模式,数组的第一个元素命名为“0”,子表达式分别位于两个圆括号中,为了使他们更加便于读取理解,你可以分配给每个子表达式它们自己的名子(键),接下来通过它们去调用匹配的结果。给子表达式命名,可以在圆括号中输入type ?。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 给子表达式命名: $pattern = "(?<Date>.*)\t(?<Text>.*)" # 生成包含Tab键的字符串 $line = "12/01/2009`tDescription" # 使用正则表达式匹配: $line -match $pattern #True # 显示结果: $matches <# # #Name Value #---- ----- #Text Description #Date 12/01/2009 #0 12/01/2009 Description #> $matches.Date #12/01/2009 $matches.Text #Description查看全部
-
一串原始的文本行通常有大量有用信息,你可以使用子表达式来收集数据,可以在之后单独使用。基本的规则是所有想通过模式来搜索的数据应当放在圆括号中,因为变量$matches会将这些子表达式以单独的序列返回。如果文本行首先包含了数据,然后是其它文本,两者之间以制表符分割,你可以如下描述这段模式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 定义模式: 由Tab分割的两个字符串 $pattern = "(.*)\t(.*)" # 生成一个由Tab分割的字符串 $line = "12/01/2009`tDescription" # 使用正则表达式匹配: $line -match $pattern #True # 显示结果: $matches <# # Name Value #---- ----- #2 Description #1 12/01/2009 #0 12/01/2009 Description #> $matches[1] #12/01/2009 $matches[2] #Description查看全部
-
python解释执行慢,代码少,开发速度快查看全部
-
1. 有序集合:list,tuple,str和unicode; 2. 无序集合:set 3. 无序集合并且具有 key-value 对:dict查看全部
-
你可以使用间隔结构“|”来搜索某一组关键字,然后找出那些实际上出现的关键字: PS I:\> "Set a=1" -match "Get|GetValue|Set|SetValue" True PS I:\> $matches Name Value ---- ----- 0 Set $matches会告诉你那些关键字实际上在字符串上出现了。但是要注意正则表达式中关键字的顺序。是因为第一个匹配到的关键字会被选中决定的。所以接下来的实例,结果感觉不正确: PS I:\> "SetValue a=1" -match "Get|GetValue|Set|SetValue" True PS I:\> $matches[0] Set 所以接下来更改关键字的顺序可以让较长的关键字被选中。 PS I:\> "SetValue a=1" -match "GetValue|Get|SetValue|Set" True PS I:\> $matches[0] SetValue 或者,你可以更加精确地定制你的正则表达式,记住你实际上搜索的是一个独立的单词。所以在关键字中加入单词边界,让顺序的影响失效。 PS I:\> "SetValue a=1" -match "\b(Get|GetValue|Set|SetValue)\b" True PS I:\> $matches[0] SetValue 也确实这样,-match只会搜索第一次匹配,如果你的源文本中可能须要和包含关键字的多次出现,可以重新使用RegEx PS I:\> $regex = [regex]"\b(Get|GetValue|Set|SetValue)\b" PS I:\> $regex.Matches("Set a=1; GetValue a; SetValue b=12") Groups : {Set, Set} Success : True Captures : {Set} Index : 0 Length : 3 Value : Set查看全部
-
# 源文本中有两个电子邮件地址,-match只能匹配到一个 $rawtext = "test@pstips.net sent an e-mail that was forwarded to admin@pstips.net." $rawtext -match "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b" True $matches Name Value ---- ----- 0 test@pstips.net # regex 对象可以匹配所有出现的电子邮箱地址,默认大小写敏感 $regex = [regex]"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b" $regex.Matches($rawtext) Groups : {test@pstips.net} Success : True Captures : {test@pstips.net} Index : 0 Length : 15 Value : test@pstips.net Groups : {admin@pstips.net} Success : True Captures : {admin@pstips.net} Index : 53 Length : 16 Value : admin@pstips.net #限制,只输出电子邮箱地址 $regex.Matches($rawtext) | Select-Object -Property Value Value ----- test@pstips.net admin@pstips.net #继续处理电子邮箱地址 $regex.Matches($rawtext) | ForEach-Object { "found: $($_.Value)" } found: test@pstips.net found: admin@pstips.net查看全部
-
正则表达式可以识别模式。它们也可以根据确定的模式从文本中过滤出数据,因此正则表达式是用来处理源文本的一款非常优秀的工具。 例如,你想从一封邮件中过滤出一个确切的电子邮件地址,就可以使用我们之前提到过正则表达式。然后就可以在变量$matches找出返回的结果。在你使用-match操作符时,$matches变量会自动被创建,并存储过滤出的结果。$matches是一个哈希表,你既可以输出一个完整的哈希表,也可以使用在中括号中的名称(键值)逐个访问其中的某个元素。 如果文本中有多个电子邮件,上面的方法还会有效吗?非常遗憾,它不会这样做。操作符-match只会匹配一次正则表达式。因此如果你想在源文本中搜索多个出现的模式,你必须切换至RegEx对象,值得一提的是RegEx对象不像-match,Regex对象默认是大小写敏感的,你要想大小写不敏感,可以参考前面的文章。查看全部
-
$a -match "\ba\w*\b" $reg=[regex]"\ba\w*\b" $b=$reg.Matches($a) $b[1].Value查看全部
-
为了和PowerShell的习惯保持一致,操作符-match是大小写不敏感的,如果你想切换至大小写敏感的操作符可以使用“-cmatch” 1 2 3 4 5 6 # -match 大小写不敏感: "hello" -match "heLLO" True # -cmatch 大小写敏感: "hello" -cmatch "heLLO" False 如果你只想在模式的部分片段中使用大小写敏感,仍旧可以使用-match,但是可以在正则表达式中指定部分模式是不是大小写敏感。跟在“(?i)”结构后的字符大小写不敏感,跟在(?-i)结构后面的字符大小写敏感。下面的例子会演示这个区别,模式中的字符字串 “st”因为被(?-i)标记为大小写敏感,所以可以匹配“TEst”,但不能匹配“TEST”。 但是如果你使用的是.NET framework的对象RegEx,它可以自动的在大小写敏感与不敏感之间切换。既可以使用IgnoreCase参数来显示的指定,也可以在模式中使用上面提到的结构来指定。 PS > [regex]::matches("test", "TEST", "IgnoreCase") Groups : {test} Success : True Captures : {test} Index : 0 Length : 4 Value : test查看全部
-
有时搜索的词语比较含糊不清,因为这些词语可能有多种写法。你可以使用限定符“?”来标记这些词语作为可选字符。非常简单,把“?”放在可选字符后面即可。这样“?”前的字符就变成了可选字符,而不是非得出现。 1 2 3 4 "color" -match "colou?r" True "colour" -match "colou?r" True 注意,此处的字符“?”并不代表任何字符,因为怕你可能会联想到简单模式匹配里面的“?”。正则表达式中的“?”,只是一个限定符,它代表的是指定字符或者子表达式出现的频率。具体到上面的例子,“u?”就确保了字符“u”在模式中不是必需的。常用的其它限定符,还有“*”(出现0次后者多次)和“+”(至少出现一次)。 如果你想标记更多的连续字符作为可选,可以把这些字符放置圆括号中建立子表达式。下面的子表达可以同时识别“Nov”和“November”: 1 2 3 4 "Nov" -match "\bNov(ember)?\b" True "November" -match "\bNov(ember)?\b" True 如果你想使用多个可选的搜索词语,可以使用“或”操作符“|”: 1 2 "Bob and Ted" -match "Alice|Bob" True 如果你想将搜索的词语和固定文本结合在一起,作为可选,仍然可以使用子表达式: 1 2 3 4 5 6 # 搜索 "and Bob": "Peter and Bob" -match "and (Bob|Willy)" True # 没有搜索到 "and Bob": "Bob and Peter" -match "and (Bob|Willy)" False查看全部
-
验证Email格式 如果你想验证用户提供的E-Mail地址是不是一个合法电子邮件格式,可以使用下面的正则表达式: 1 2 3 4 5 6 7 8 $parttern = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b" "mosser@pstips.net" -match $parttern ".@ ." -match $parttern <# #输出: #True #False #> 无论什么时候,希望一个表达式以一个单独的“单词”在文本中出现,可以使用分隔符:单词边界(定位符”\b”),这样正则表达式就会知道你感兴趣的是字符串中除去那些白空格(像空格,制表符,换行符)以外的字符。 紧随其后的正则表达式指定的是那些字符可以被允许出现在电子邮件地址中。被允许的字符放在方括号中,由字符区间(例如:A-Z0-9″)和单个字符(例如:”._%+-“)构成。“+”放在方括号后面是一个限定符,意味着前面的字符至少出现一次。当然你可以规定出现更多的字符。 接下来的是“@”,@之后的字符可以和@前面的一样。在电子邮件地址后面必须出现一个圆句点。但是因为圆句点属于特殊字符,所以加了反斜杠转义,让它以普通字符的形式出现在正则表达式中。 在圆句点之后是域标识,它们完成由字母([A-Z])组成,限定符({2,4})紧随其后指定域标识符应当至少由2个字符,至多由4个字符组成。 但是上面的正则表达式仍旧有一些瑕疵: 1 2 3 4 5 6 7 8 9 $parttern = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$" "请邮件联系: mosser@pstips.net 好不好?" -match $parttern "mosser@pstips.net" -match $parttern <# #输出: #False #True #>查看全部
-
元素 描述 $ 在字符串的结尾匹配 \A 在字符串的开始匹配(包含多行文本) \b 在单词的边界匹配 \B 不在单词的边界匹配 \Z 在字符串的结尾匹配(包含多行文本) ^ 在字符串的开始匹配 1 2 3 4 5 6 7 8 9 10 $parttern="\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" "192.168.10.3" -match $parttern "a.168.10.3" -match $parttern "1000.168.10.3" -match $parttern <# #输出 #True #False #False #> 这里模式被描述成4个类似的数字,每个数字以圆句句号分割,每个数字的位数介于1-3。另外在开始和结尾可以包含空格。当这些数字处于0到255之间时,IP的验证还是挺完美的。 但是当某个数字超过255时,则显得无能为力。查看全部
-
限定符 上面表格中列出的每个通配符,可以代表一个确定的字符。使用限定符,可以精确地确定字符的出现频率。例如”\d{1,3}”代表一个数字字符出现1到3次。 元素 描述 * 匹配一个元素0次或者多次(最大限度地匹配) *? 匹配前面的元素零次或者多次(最小限度地匹配) .* 匹配任意个数的任意字符(包括0个字符) ? 匹配上一个元素0次或者1次(最大限度地匹配) ?? 匹配上一个元素0次或者1次(最小限度地匹配) {n,} 匹配上一个元素至少n次 {n,m} 匹配上一个元素n至m次 {n} 匹配上一个元素n次 + 匹配上一个元素一次或者多次查看全部
举报
0/150
提交
取消