欢迎光临
我们一直在努力

Java与正则表达式(2年级2)-JSP教程,Java技巧及代码

建站超值云服务器,限时71元/月

java与正则表达式(2年级2)

学习正则表达式,我本来也按照正则表达式的组件一个个地攻。java中写的summary of regular-expression constructs也不过6页纸,花上1天半天的时间一个个测试,学得也差不多了。可惜yqj2065的记性好、忘性大,3天之后记得几个最简单的东西了。惨。

msdn上的正则表达式介绍 就是完整的教材,yqj2065又学习了一次(jscript),10天后又忘得7788了。

现在我变个花样考虑:如果我设计regex,按照(2年级之1)中的5点能不能搞定呢?把核心5点记住先:

1. 基本正则表达式:一个单字符a(其中a 在正规字符的字母表∑中),以及元字符或元字符组成。可能是: l (a) = {a}; l (ε) ={ε}; l (ф) = {}。

r和s 均是正则表达式时:

2. r | s表达式: l (r | s) = l (r) ∪ l (s)。

3. rs表达式: l (r s) = l (r) l (s)。

4. r*表达式: l (r*) = l (r) *。

5. (r)格式的表达式: l ( (r)) = l (r),括号并不改变语言,它们只调整运算的优先权。闭包>连结>并集。

我不用脑袋,用5个指头记它们。那个指头忘性大,就打那个指头。单字符、并集 |、连结、闭包 *、括号()。

§3字母表∑

单字符依赖于字母表∑,java支持unicode。所有,∑=unicode。比如说:

string str=” 单字符依赖于字母表”,regex是字。效果不错。

我想使用editpad pro方便一些,它却不支持unicode。也罢,本来就不准备现在研究它(3年级再搞。),先搞定ascii – the american standard code for information interchange,好像在汇编语言中经常查一下。现在都有些模糊了。

ascii大概分成这几个部分:可打印和不可打印字符。

l 不可打印字符non-printable characters:java中有几个不可打印字符,能放在正则表达式中,这些东西倒是有点奇怪。

l 可打印字符:所有大写和小写字母、所有数字、所有标点符号和一些其他符号。这里的关键在于有一些可打印字符with special meanings,成为了元字符(metacharacters)。

所有的ascii字符中,我们千调万选找了一个最特殊的字符backslash \,作为转义escape开关。虽然与java的转义符号一样,我还是奇怪为什么选它而不选#。它很容易与除号/混淆,另外m$ os中的目录常常是e:\regex\1\2,我听说c++编程时,其regex要用e:\\\\regex\\\\1去匹配,不知在java的源代码中,怎么样。

核心1点说明:单一的a、x、#,’,” 都是基本的regex。单一的元字符都不是基本的regex。

练习:str=” b!c@d#e$f%g^h&j&k*l”+

”(m)n_o+p|q\r=s-t/u.v,w?x>y<z\"aa\”

①regex="#"(或\"、\’、 r、 \\、 >、n、)注意:java的源代码中string要使用转义\"而且regex="\"",但正则表达式是"如程序:

import java.util.regex.*;

class regex1{

public static void main(string args[]) {

string str="for my\" money\" ";

string regex="\""; //

pattern p=pattern.compile(regex);

matcher m=p.matcher(str);

boolean result=m.find();

system.out.println(result);

}

}

这里的要点是:java语言本身对源代码中的一些字符\"要经过编译处理,之后正则表达式引擎才得到一个regexp"。这也是c++用4个backslash匹配一个\文本字符的原因。我们要区别java语言与正则表达式各自的要求。

在使用各种正则表达式练习器时,一定要注意。

§4并集

核心2点是a|b。在文档中称为"character class", 也叫 "character set"。这就不好翻译了,字符集容易与ascii字符集等混淆,字符类?不伦不类。也许叫字符并集比较好,

① 对于文本fororarafar,如何匹配for和far呢?记住并集运算的优先级最低。因此f(o|a)r是正确答案,当然,f(a|o)r也行,它们的顺序无所谓。但 fo|ar将可以(可以!)匹配fo和ar。

② 如果有regex如f(a|s|d|f|g|h|j|l)r,人们常常喜欢简单一点,写成f[asdfghjl]r。如此一来,多了两个元字符[和]。

③ 如果有regex如f[123456]r,人们简单的写成f[1-6]r。注意,连字符不是元字符,仅仅在[ ]之间而且在有顺序的东西之间才有特殊语义,如[1-5a-ya-f]。在[ ]之外,hyphen-是普通字符。

④ 如果我们希望全选呢?有一个非常好用又经常误用的元字符. 我们在后面举例说明。

⑤ 如果我们希望反选呢?比如除a、b、c外的所有f⊙r,用集合运算表示就相当于∑-{a,b,c}。我们写出[^abc] ,注意:caret^只有紧跟在[后面才表示这个语义。对于文本f^rfarfbrffhrf^^r ,f[^abc]r可以匹配f^r和fhr。而f[a^bc]r匹配far、f^r、fbr、fcr。caret^不同于-,它是一个元字符,但元字符^表示的是另外的一个概念,这里的^和-相似——可以理解为非元字符。

⑥ 简写和其否定:[0-9] 有一种简写方式\d。这让我们想起汇编语言的助记符,但\d使我们加重了记忆的负担。\d等价于[^0-9]。

此外,java中,\w等价于[0-9a-z_a-z] ,例如用f\wr匹配下列字符串时(里面有一个underscore),结果是: farf^rfhrf1rf价rf_r,而\w——要注意看看清楚,是大写的w——\w等价于[^\w] 也等价于[^0-9a-z_a-z]。此外,还有大s和小s,\s等价于一些不可打印字符[\t\r\n\f\x0b] ,大s是小s的否定。

大s徐熙媛

⑦ have a rest……

练习:

regex(在java源代码中)

string



i say:\"i love you ,java ,are you love me?\"

\或\\

【patternsyntaxexception】

i say\\i\\love\\java

\\\\

i say\\i\\love\\java【2.2-1】

f(a|o)r或f(o|a)r f[ao]r

forfaforfarfoar

fa|or

forfaforfarfoar

程序2.2-1:

import java.util.regex.*;

class regex1{

public static void main(string args[]) {

string regex="y\\\\";//试一试"y\\"

string str="i say\\i\\love\\java ";

system.out.println(str);

pattern p=pattern.compile(regex);

matcher m=p.matcher(str);

string s=m.replaceall("⊙⊙"); // ("") 删除

system.out.println(s);

}

}

程序2.2-2:

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Java与正则表达式(2年级2)-JSP教程,Java技巧及代码
分享到: 更多 (0)

相关推荐

  • 暂无文章