Ocp 正则表达式 详解

 

http://www.cuug.com/xueyuanzhuanqu/jishuwenzhang/201110/jishuwenzhang-1114.html

oracle中的正则表达式一题

108. View the Exhibit and examine the details for the CATEGORIES_TAB table.

Evaluate the following incomplete SQL statement:

SELECT category_name,category_description

FROM categories_tab

You want to display only the rows that have 'harddisks' as part of the string in the

CATEGORY_DESCRIPTION column.

Which two WHERE clause options can give you the desired result? (Choose two.)
A. WHERE REGEXP_LIKE (category_description, 'hard+.s');

B. WHERE REGEXP_LIKE (category_description, '^H|hard+.s');

C. WHERE REGEXP_LIKE (category_description, '^H|hard+.s$');

D. WHERE REGEXP_LIKE (category_description, '[^H|hard+.s]');

REGEXP_LIKE :与Oracle SQL 函数LIKE的功能相似.

POSIX 正则表达式简介
由标准的元字符(metacharacters)所构成:

'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
'$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。
'.' 匹配除换行符之外的任何单字符。
'?' 匹配前面的子表达式零次或一次。
'+' 匹配前面的子表达式一次或多次。
'*' 匹配前面的子表达式零次或多次。
'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
'( )' 标记一个子表达式的开始和结束位置。
'[]' 标记一个中括号表达式。
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。

字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。

根据以上基础知识,分析四个选项匹配的结果:
A. 'hard+.s'能够匹配harddis,其中表达式的+号代表前一个d的重复,“.”可以代表d和s之间的“i”
B. '^H|hard+.s'是比A选项多了一个可选,也就是匹配行首以大写的h开头的字符串,但因为可选项的另一部分跟A选项完全相同,所以也能匹配A选项的匹配结果。
其实看到这里就不用往下看了,因为两个正确答案就是AB。
C的表达式是'^H|hard+.s$',那个$代表字符串的尾部,也就是说s后面应该没有字符了,显然跟harddisk这个单词不相符。
D的表达式是'[^H|hard+.s]',中括号中的表达式只能匹配其中一个字符,也就是匹配“H”“h”“a”“r”“d”等的任意一个字符,但是请注意中括号的开始使用了“^”符号,意思是反选,中括号内能匹配的字符反而是不想要的,对于“harddisk”这个字符串,只有“i”和“k”是符合匹配条件的,显然D选项更不靠谱。

说了这么多,希望同学们能明白我在说什么:)

=======================================

解读047关于正则表达式'[^Ale|ax.r$]'
http://www.itpub.net/thread-1327778-1-1.html

92. Evaluate the following expression using meta. character for regular expression:
'[^Ale|ax.r$]'
Which two matches would be returned by this expression? (Choose two.)
A. Alex
B. Alax
C. Alxer
D. Alaxendar
E. Alexender
Answer: DE
首先看些
Oracle正则表达式语法,正则表达式是在10g才添加进来的,其匹配字符、量词字符、匹配选项、相关函数如下:

匹配字符:


字符

功能

^

标记行的开始

$

标记行的结束

= =

匹配字符族,如:[=a=] 可匹配字符a、&acirc;、&atilde;、&auml;、&aring;等

.

匹配任何字符(除了NULL)

[:alnum:]

匹配任何字母和数字

[:alpha:]

匹配任何字母

[:blank:]

匹配空格

[:cntrl:]

匹配任何控制字符(在ASCII码表中不可打印的字符,如ESC键)

[:digit:]

任何数字

[:graph:]

任何 标点符号、大小写字母以及数字

[:lower:]

任何小写字母

[:print:]

任何可打印的字符

[:punct:]

任何标点符号,如,.+-=等

[:space:]

任何空白字符,如回车、换行、制表等

[:upper:]

任何大写字母

[:xdigit:]

任何十六进制数字,即0-9A-F

|

分隔符

()

子表达式,可作为量词或向后引用的前段

[char]

匹配括号中的任何字符,[^char]表示除开括号中字符后的任何字符



 

量词字符:


 

字符

功能

*

匹配0次或多次

?

匹配0次或1次

+

匹配1次或多次

{m}

匹配m次

{m,}

匹配至少m次

{m,n}

匹配至少m次,最多n次

\n

引用第n个匹配


 

匹配选项:


 

字符

功能

c

匹配时区分大小写

i

匹配时不区分大小写

m

源字符串为多行匹配

n

.可匹配任何换行符


函数:
REGEXP_LIKE 是LIKE语句的正则表达式版本
语法:REGEXP_LIKE(源字符串, 匹配表达式[,匹配选项])

REGEXP_INSTR 返回源字符串中首次匹配正则表达式的起始位置
语法:REGEXP_INSTR(srcstr, pattern [, position [, occurrence[, return_option [, match_option]]]])
      srcstr:源字符串
      pattern:正则表达式
      position:搜索开始位置
      occurrence:返回第几个匹配项
      return_option:返回选项,0表示开始位置,1表示返回匹配的结束位置
      match_option:匹配选项

REGEXP_SUBSTR 返回源串中匹配正则表达式的子字符串
语法:SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]])
      srcstr:源字符串
      pattern:正则表达式
      position:搜索的开始位置
      occurrence:返回第几个匹配的字符串
      match_option:匹配选项

REGEXP_REPLACE 用执行字符串替换源文本中与正则表达式匹配的字符串
语法:REGEXP_REPLACE(srcstr, pattern [,replacestr [, position[, occurrence [, match_option]]]])
      srcstr:源字符串
      pattern:正则表达式
      replacestr:新的字符串
      position:搜索起始位置
      occurrence:第几个匹配项
      match_option:匹配选项

题目的意思是哪两个选项能和'[^Ale|ax.r$]'匹配
'[^Ale|ax.r$]'中^表示只匹配不在集合{'A','l','e','|','a','x','.','r','$'}中的字符, 此处的'|'、'.'、'$'只是表示普通的字符,而非匹配符
select regexp_instr('Alex','[^Ale|ax.r$]')      from dual;
REGEXP_INSTR('ALEX','[^ALE|AX.R$]')
-----------------------------------
0
select regexp_instr('Alax','[^Ale|ax.r$]')      from dual;
REGEXP_INSTR('ALAX','[^ALE|AX.R$]')
-----------------------------------
0
select regexp_instr('Alxer','[^Ale|ax.r$]')     from dual;
REGEXP_INSTR('ALXER','[^ALE|AX.R$]')
------------------------------------
0
select regexp_instr('Alaxendar','[^Ale|ax.r$]') from dual;
REGEXP_INSTR('ALAXENDAR','[^ALE|AX.R$]')
----------------------------------------
6
select regexp_instr('Alexender','[^Ale|ax.r$]') from dual;
REGEXP_INSTR('ALEXENDER','[^ALE|AX.R$]')
----------------------------------------
6
因此可见答案是DE

 

http://www.itpub.net/thread-1467348-1-1.html 试题解析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值