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

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 (Ф) = {}

       rs 均是正则表达式时:

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。效果不错。
2-2-1

    我想使用
EditPad Pro方便一些,它却不支持Unicode。也罢,本来就不准备现在研究它(3年级再搞。),先搞定ASCII - The American Standard Code for Information Interchange,好像在汇编语言中经常查一下。现在都有些模糊了。

 

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

l        不可打印字符Non-Printable CharactersJava中有几个不可打印字符,能放在正则表达式中,这些东西倒是有点奇怪。

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

      

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

核心1说明:单一的ax# 都是基本的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++4backslash匹配一个/文本字符的原因。我们要区别Java语言与正则表达式各自的要求。

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

 

§4并集

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

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

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

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

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

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

    简写和其否定:[0-9] 有一种简写方式/d。这让我们想起汇编语言的助记符,但/d使我们加重了记忆的负担。/D等价于[^0-9]
此外,Java中,/w等价于[0-9a-z_A-Z] ,例如用f/wr匹配下列字符串时(里面有一个underscore),结果是: farf^rfHrf1rfrf_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//Java2.2-1

f(a|o)rf(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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值