文章目录
一、目的
此博文利用正则表达中的懒惰模式(非贪婪模式)匹配文档中的人物对话内容,并用自定义计数器累计出一篇文章中有多少段对话,可用之判断一篇文章的类型。最后将文档中的对话内容写入一个新文档。
比如: “小耳朵”说:“春天到了!” 。妈妈笑着说:“是呀。”
这句话中有两小段对话:①“春天到了!” ②“是呀。”
二、实现过程中需要思考的问题
1. 如何确定 “对话” 的形式?
答: 按照汉语标点符号 “双引号” 来判定是对话形式。
(1)提示语 +人物所说的话 + 标点符号
组成人物对话语
<例>
妈妈对我说: “这是一只老乌鸦在叫。它可能饿了,要吃东西呢。”
注:什么是提示语呢?
就是对话中除了人物所说的话外,所做的启示性说明的文字。它告诉我们这句话是谁说的,他怎么说的,说话的语气、动作、表情等。这样人物就活灵活现了。例如在这句话(妈妈对我说:“这是一只老乌鸦在叫。它可能饿了,要吃东西呢。”)中(妈妈对我说)是提示语
(2)提示语位置的变化
<例>
“这是一只老乌鸦在叫。它可能饿了,要吃东西呢。”妈妈对我说。(提示语在后)
“这是一只老乌鸦在叫。” 妈妈对我说, “它可能饿了,要吃东西呢。” (提示语在中间)
(3)特殊的情况下,可以省略提示语
<例>
“竺爷爷!竺爷爷!”
“什么事情啊?”
“竺爷爷,杏花开啦!”
“什么时候?”
“刚才。”
“是第一朵吗?”
“是。”
2. 只要出现双引号都是人物对话吗?
答: 当然不是。下面来谈谈双引号的几种用法 。此部分引用自:语文中双引号的几种用法?
(1)直接引用
<例>
① 我说:“你知道双引号的用法有几种吗?”
注:在涉及到对话时,用双引号直接引用对话到文章中。
② “满遭损,谦受益”这句格言,流传到今天至少有两千年了。
注:这也是直接引用的一种,不过,“‘满遭损,谦受益’”与“这句格言”成为了同位复指,共同做了“流传”的主语,所以,双引号里的内容结束后,不需要加上其他标点)
③下山的路上,不知谁哼起《高山青》,“阿里山的姑娘美如水”,但整个游程却没有看到。
注:这是一个陈述句,作者只引用《高山青》里的一句歌词作为行文的内容,所以,在所引用的话的引号外面加上逗号,与其他话语组成一个完整的陈述内容
④现代画家徐悲鸿笔下的马,正如有的评论家所说的那样,“形神兼备,充满生机”。
注:这一句与前面所讲的例②有异曲同工之妙。
只不过所引用的内容的位置,前者为“主”,后者为“宾”
(2)表示具有特殊含义的词语。例如绰号、他称
<例>
①“奶茶妹妹”章泽天长相很是清纯。
注:在称呼别人的绰号时,需要使用双引号。
②这样的“聪明人”还是少一点好。
注:这里的“聪明人”加上引号,其实是反话正说,修辞手法称之为反语。“聪明人”,既“愚笨者”。
(3)表示着重论述的对象。
散文的重要特点是“形散而神不散”。
结论:汉语中一段对话都是由 < “ > 开始,由 <,”> <。”> 或 <!”> 或 <?”> 或 <……”> 五种标点符号同反引号组合结束。因此以下用正则匹配时主要规定了以这四种组合来匹配一段对话。
中文省略号打法:shift + 6
三、主要实现思路
抓住以上找到“对话”的方法后,即可考虑如何用编程语言剔出文档中对话内容。思路如下:
- BufferedReader 读出文档数据流; 按行读文档 line = buf .readLine();
- 将读出的行存入可变字符序列 str;StringBuffer str = new StringBuffer(); 将读出的行存入可变字符序列 str;
StringBuffer str = new StringBuffer();//定义可变字符串序列
str. append(line);//将读出的行添加到可变字符串中,用于之后从字符串中剔出对话
- 用Pattern.compile()规定正则表达式; Matcher()按规定的正则表达匹配字符串;
- 用m.group()得到匹配结果并写入新文档;
- 每匹配到一个结果,计数器+1,最终可得到总对话数。
- 最后用Runtime调用记事本,打开新写成的文档,便于查看。(此步可用可不用,也可手动打开。新生成的文档与原文档在同一目录下。)
四、正则表达式
详细使用参见:正则表达式:Pattern类与Matcher类详解
1. Pattern类与Matcher类
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern。 一个Pattern是一个正则表达式经编译后的表现模式。 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
① Pattern类简要说明
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)方法创建一个正则表达式。
Pattern p=Pattern.compile("\\w+");
p.pattern();//返回 \w+
②Matcher类简要说明
Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false 。
matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true 。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.matches();//返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
Matcher m2=p.matcher("2223"