有一串字符,如何把指定词(如数字图像)外的字符变成■号?要等长。
效果如下:
原字符串:一些常用的数字图像处理算法
替换效果:■■■■■数字图像■■■■
以上是简单的,就一个指定词,如果有多个指定词又怎么办?
谢谢
11 个解决方案
#1
正则表达式
#2
怎么搞?
#3
1、将指定词的位置找出来用作第三步的参数
2、定义一个原字符串长度的■■■■....
3、用replace方法替换■■■■....字符串
多个指定词就replace多次
2、定义一个原字符串长度的■■■■....
3、用replace方法替换■■■■....字符串
多个指定词就replace多次
#4
using System;
class Test
{
static string Replace(string s, string r, char c)
{
return s.Replace(r, new String(c, r.Length));
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法";
string r0 = "一些常用的";
string r1 = "处理算法";
string s1 = Replace(s0, r0, '■');
string s2 = Replace(s1, r1, '■');
Console.WriteLine(s0);
Console.WriteLine(s2);
}
}
/* 程序输出:
一些常用的数字图像处理算法
■■■■■数字图像■■■■
*/
class Test
{
static string Replace(string s, string r, char c)
{
return s.Replace(r, new String(c, r.Length));
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法";
string r0 = "一些常用的";
string r1 = "处理算法";
string s1 = Replace(s0, r0, '■');
string s2 = Replace(s1, r1, '■');
Console.WriteLine(s0);
Console.WriteLine(s2);
}
}
/* 程序输出:
一些常用的数字图像处理算法
■■■■■数字图像■■■■
*/
#5
你的档案部的头儿想要一个工具用来检查重复的单词(如:this this),一个在大量编辑文档的时候通常会遇到的问题。你的工作就是创建一个解决方案:
接受任何数量要检查的文件,报告每个文件中带有重复单词的那些行,突出显示这些重复的单词,同时确保原文件名称和这些行出现在报表中。
跨行检查,找到一行的最后一个单词和下一行开头第一个单词出现重复的情况。
找出重复的单词,不管他们是否大小写不同(如:The the),以及允许在这些重复单词之间含有不同数量的空白字符(空格、制表符、新行等)
找出重复的单词,甚至这些单词被Html标签隔开。(如:…it is <B>very</B> very important.)
要解决上述的实际问题,我们首先要做的就是写出正则表达式,找到我们想要的文本,忽略我们不需要的文本,然后使用我们的C#代码对获取的文本进行处理。
在使用正则表达式之前,你也许多少已经知道什么是正则表达式。甚至你不知道,你几乎可以肯定已经熟悉它的基本概念了。
你知道report.txt是一个具体的文件名称,但是如果你有任何Unix或者DOS/Windows的经验,你也知道“*.txt”可以用来选择多个文件。这种形式的文件名,有一些字符有着特殊的含义。星号意味着匹配任何东西,问号意味着匹配一个字符。如:“*.txt”表示任何文件名以.txt结尾的文件。
文件名称得模式匹配,使用了有限的匹配符。还有当前网络上的搜索引擎也允许使用某些指定的匹配符来进行内容搜索。正则表达式采用丰富的匹配字符,可以处理各种复杂的问题。
首先我们介绍两个位置匹配符:
^ : 表示一行文字的开始位置
$ : 表示一行文字的结束位置
如:表达式:"^Cat", 匹配的单词Cat出现在行的开始处,注意^是一个位置字符,不是要匹配字符的本身。
同样,表达式:"Cat$" 匹配的单词Cat出现来一行的结尾处。
接下来,我们介绍表达式中的方括号"[]", 它表示匹配括号中字符中的一个。如:
表达式:"[0123456789]"将匹配数字0到9的任何一个。
例如:我们要查找文本中,所有包含gray或者grey,那么表达式可以这么写:"gr[ea]y"
[ea]表示匹配ea中的一个,而不是整个ea。
如果我们要匹配html中的<H1><H2><H3><H4><H5><H6>的标签,我们可以写表达式:
"<H[123456]>",但是如果我们要匹配所有字符中的一个呢?哈,问题就来了,在方括号中写出所有的字符?很幸运,我们不必这么做,我们引进范围符号"-";
使用范围符号,我们只需要给出一个范围的边界字符即可,上面的Html例子,我们可以写成:"<H[1-6]>"
而表达式:"[0-9a-zA-Z]"的意思现在清楚了吧?它匹配数字字符,小写26个字母和大写26个字母中的一个。
出现在[]中的"^"符号
如果你看到表达式如:"[^0-9]",此时,"^"不再是前面说的位置符号,这里它是否定符号,表示排除的意思,上面的表达式,表示不包含数字0到9的字符。
思考1:表达式"q[^u]"的意思。假如有下列的单词,那些将被匹配?
Iraqi
Iraqian
miqra
qasida
qintar
qoph
zaqqum
除了范围字符的表示之外,还有一个是点字符".",点字符出现在表达式中,表示匹配任何字符。
如表达式:"07.04.76"将匹配:
形如:07/04/76, 07-04-76,07.04.76。
如果我们需要在某些字符中可选择,我们可以采用选项字符"|":
选项字符有“或"的意思,比如表达式:"[Bob|Robert]"则表示Bob或者Robert将被匹配。
现在看我们前面提到的表达式:"gr[ea]y" ,利用选项字符我们可以写作"grey|gray",它们是相同的。
圆括号的使用:圆括号在表达式中也是被作为元字符使用,如前面的表达式,我们可以写成:"gr(e|a)y",这里的圆括号是必须的,如果没有圆括号,那么表达式"gre|ay"将匹配gre或者ay,这不是我们想要的结果。如果你还不是很清楚,让我们看一下下面的例子:
在电子邮件中查找所有以From:或者Subject:或者Date:开头的行,我们比较下面的两个表达式:
表达式1:"^From|Subject|Data: "
表达式2:"^(From|Subject|Data): "
哪一个是我们想要的?
很明显,表达式1的结果不是我们想要的结果,它匹配的将是:From或者Subjec或者Data: ,表达式2使用圆括符,就能满足我们的需要。
单词边界
我们已经可以匹配出现在行首和行尾的字符,那么如果我们想定位的不仅仅是行首或者行尾呢?我们需要引入单词边界符号,单词边界符号是:"\b",斜杠不可省略,否则变成匹配字母b。使用单词边界符号,我们可以定位匹配的位置必须出现在一个单词的开始或者结尾部分,而不是在单词的中间。例如:"\bis\b"表达式在字符串"This is a cat."中将匹配单词"is"而不会匹配单词"This"中的"is"。
字符串边界符号
除了上述的位置符号,如果我们要匹配的是整个字符串(含多个单词)那么我们可以使用下面的两个符号:
\A :表示字符串的开始处;
\z :表示字符串的结束处。
表达式:"\AThis is a cat\z"将匹配这个字符串"This is a cat"。
使用边界定位符号,这里要提到一个重要的概念,那就是单词字符,单词字符表示可以构成单词的字符,它们是[a-zA-Z0-9]中的任意一个字符。所以上面的表达式也会在句子"This is a cat."得到匹配。匹配的结果不包含句号。
重复数量符号
让我们看表达式:"Colou?r", 这个表达式中出现了我们还没有见过的问号,(这个问号和文件名称匹配的问号意义不同),它表示符号前面的一个字符可以被重复的次数,"?"表示0次或者1次,前面的表达式中问号表示u可以出现0或1次,所以它将匹配"Color"或者"Colour"。
下面是其他的重复数量符号:
+ :表示1次或者多次
* :表示0次或者多次
例如我们要表示一或多个空格,我们可以写表达式:" +";
如果要表示具体次数呢?我们引入花括符{}。
{n} : n是具体的数字,表示重复n次。
{n,m}: 表示最少那次,最多m次。
这些符号都限定了符号前面一个字符的匹配次数。但是如果你想重复多个字符,比如一个单词,那么怎么办?我们再次使用圆括号,前面我们把圆括号作为选项的范围符号,这里是圆括的另外一种使用方法,它被表示为一个组,例如表达式:“(this)"这里的this就是一个组,那么问题就好办了,重复数量符号可以用来表示它前面一个组的重复次数。
现在回到查找重复单词的问题,假如我们要找到“the the”,根据我们迄今为止学到的知识,我们可以写出表达式:
"\bthe +the\b"
表达式的意思是匹配两个the中间有一个或多个空格隔开。
同样,我们还可以写成:
"\b(the +){2}"
但是如果要找全部可能的重复单词呢?我们目前的知识还不足以解决这个问题,下面我们引进反向引用的概念,我们已经看到圆括号可以作为组的边界,一个表达式中可以有多个被圆括号限定的组,根据它们出现的次序,这些组缺省的被分配了一个组号,第一个出现的组号为1号,依次类推。那么反向引用就是可以在之后的表达式的位置上是使用"\n"来引用这个组,这里n是被引用的组号。反向引用就像是程序中的变量一样,下面我们看具体的例子:
前面的单词重复表达式,现在我们采用反向引用可以写做:
"\b(the) +\1\b"
现在,如果我们要匹配所有的重复单词,我们就可以改写表达式为:
"\b([a-zA-Z]+) +\1\b"
最后一个问题是,如果我们要匹配的字符是正则表达式中的符号,怎么办?对,使用转义符号"\", 例如如果你要匹配一个小数点,那么你可以:"\.",还要注意的是如果在程序中使用表达式那么"\"也要按照字符串的规定变成"\\"或者在表达式前面加@。
接受任何数量要检查的文件,报告每个文件中带有重复单词的那些行,突出显示这些重复的单词,同时确保原文件名称和这些行出现在报表中。
跨行检查,找到一行的最后一个单词和下一行开头第一个单词出现重复的情况。
找出重复的单词,不管他们是否大小写不同(如:The the),以及允许在这些重复单词之间含有不同数量的空白字符(空格、制表符、新行等)
找出重复的单词,甚至这些单词被Html标签隔开。(如:…it is <B>very</B> very important.)
要解决上述的实际问题,我们首先要做的就是写出正则表达式,找到我们想要的文本,忽略我们不需要的文本,然后使用我们的C#代码对获取的文本进行处理。
在使用正则表达式之前,你也许多少已经知道什么是正则表达式。甚至你不知道,你几乎可以肯定已经熟悉它的基本概念了。
你知道report.txt是一个具体的文件名称,但是如果你有任何Unix或者DOS/Windows的经验,你也知道“*.txt”可以用来选择多个文件。这种形式的文件名,有一些字符有着特殊的含义。星号意味着匹配任何东西,问号意味着匹配一个字符。如:“*.txt”表示任何文件名以.txt结尾的文件。
文件名称得模式匹配,使用了有限的匹配符。还有当前网络上的搜索引擎也允许使用某些指定的匹配符来进行内容搜索。正则表达式采用丰富的匹配字符,可以处理各种复杂的问题。
首先我们介绍两个位置匹配符:
^ : 表示一行文字的开始位置
$ : 表示一行文字的结束位置
如:表达式:"^Cat", 匹配的单词Cat出现在行的开始处,注意^是一个位置字符,不是要匹配字符的本身。
同样,表达式:"Cat$" 匹配的单词Cat出现来一行的结尾处。
接下来,我们介绍表达式中的方括号"[]", 它表示匹配括号中字符中的一个。如:
表达式:"[0123456789]"将匹配数字0到9的任何一个。
例如:我们要查找文本中,所有包含gray或者grey,那么表达式可以这么写:"gr[ea]y"
[ea]表示匹配ea中的一个,而不是整个ea。
如果我们要匹配html中的<H1><H2><H3><H4><H5><H6>的标签,我们可以写表达式:
"<H[123456]>",但是如果我们要匹配所有字符中的一个呢?哈,问题就来了,在方括号中写出所有的字符?很幸运,我们不必这么做,我们引进范围符号"-";
使用范围符号,我们只需要给出一个范围的边界字符即可,上面的Html例子,我们可以写成:"<H[1-6]>"
而表达式:"[0-9a-zA-Z]"的意思现在清楚了吧?它匹配数字字符,小写26个字母和大写26个字母中的一个。
出现在[]中的"^"符号
如果你看到表达式如:"[^0-9]",此时,"^"不再是前面说的位置符号,这里它是否定符号,表示排除的意思,上面的表达式,表示不包含数字0到9的字符。
思考1:表达式"q[^u]"的意思。假如有下列的单词,那些将被匹配?
Iraqi
Iraqian
miqra
qasida
qintar
qoph
zaqqum
除了范围字符的表示之外,还有一个是点字符".",点字符出现在表达式中,表示匹配任何字符。
如表达式:"07.04.76"将匹配:
形如:07/04/76, 07-04-76,07.04.76。
如果我们需要在某些字符中可选择,我们可以采用选项字符"|":
选项字符有“或"的意思,比如表达式:"[Bob|Robert]"则表示Bob或者Robert将被匹配。
现在看我们前面提到的表达式:"gr[ea]y" ,利用选项字符我们可以写作"grey|gray",它们是相同的。
圆括号的使用:圆括号在表达式中也是被作为元字符使用,如前面的表达式,我们可以写成:"gr(e|a)y",这里的圆括号是必须的,如果没有圆括号,那么表达式"gre|ay"将匹配gre或者ay,这不是我们想要的结果。如果你还不是很清楚,让我们看一下下面的例子:
在电子邮件中查找所有以From:或者Subject:或者Date:开头的行,我们比较下面的两个表达式:
表达式1:"^From|Subject|Data: "
表达式2:"^(From|Subject|Data): "
哪一个是我们想要的?
很明显,表达式1的结果不是我们想要的结果,它匹配的将是:From或者Subjec或者Data: ,表达式2使用圆括符,就能满足我们的需要。
单词边界
我们已经可以匹配出现在行首和行尾的字符,那么如果我们想定位的不仅仅是行首或者行尾呢?我们需要引入单词边界符号,单词边界符号是:"\b",斜杠不可省略,否则变成匹配字母b。使用单词边界符号,我们可以定位匹配的位置必须出现在一个单词的开始或者结尾部分,而不是在单词的中间。例如:"\bis\b"表达式在字符串"This is a cat."中将匹配单词"is"而不会匹配单词"This"中的"is"。
字符串边界符号
除了上述的位置符号,如果我们要匹配的是整个字符串(含多个单词)那么我们可以使用下面的两个符号:
\A :表示字符串的开始处;
\z :表示字符串的结束处。
表达式:"\AThis is a cat\z"将匹配这个字符串"This is a cat"。
使用边界定位符号,这里要提到一个重要的概念,那就是单词字符,单词字符表示可以构成单词的字符,它们是[a-zA-Z0-9]中的任意一个字符。所以上面的表达式也会在句子"This is a cat."得到匹配。匹配的结果不包含句号。
重复数量符号
让我们看表达式:"Colou?r", 这个表达式中出现了我们还没有见过的问号,(这个问号和文件名称匹配的问号意义不同),它表示符号前面的一个字符可以被重复的次数,"?"表示0次或者1次,前面的表达式中问号表示u可以出现0或1次,所以它将匹配"Color"或者"Colour"。
下面是其他的重复数量符号:
+ :表示1次或者多次
* :表示0次或者多次
例如我们要表示一或多个空格,我们可以写表达式:" +";
如果要表示具体次数呢?我们引入花括符{}。
{n} : n是具体的数字,表示重复n次。
{n,m}: 表示最少那次,最多m次。
这些符号都限定了符号前面一个字符的匹配次数。但是如果你想重复多个字符,比如一个单词,那么怎么办?我们再次使用圆括号,前面我们把圆括号作为选项的范围符号,这里是圆括的另外一种使用方法,它被表示为一个组,例如表达式:“(this)"这里的this就是一个组,那么问题就好办了,重复数量符号可以用来表示它前面一个组的重复次数。
现在回到查找重复单词的问题,假如我们要找到“the the”,根据我们迄今为止学到的知识,我们可以写出表达式:
"\bthe +the\b"
表达式的意思是匹配两个the中间有一个或多个空格隔开。
同样,我们还可以写成:
"\b(the +){2}"
但是如果要找全部可能的重复单词呢?我们目前的知识还不足以解决这个问题,下面我们引进反向引用的概念,我们已经看到圆括号可以作为组的边界,一个表达式中可以有多个被圆括号限定的组,根据它们出现的次序,这些组缺省的被分配了一个组号,第一个出现的组号为1号,依次类推。那么反向引用就是可以在之后的表达式的位置上是使用"\n"来引用这个组,这里n是被引用的组号。反向引用就像是程序中的变量一样,下面我们看具体的例子:
前面的单词重复表达式,现在我们采用反向引用可以写做:
"\b(the) +\1\b"
现在,如果我们要匹配所有的重复单词,我们就可以改写表达式为:
"\b([a-zA-Z]+) +\1\b"
最后一个问题是,如果我们要匹配的字符是正则表达式中的符号,怎么办?对,使用转义符号"\", 例如如果你要匹配一个小数点,那么你可以:"\.",还要注意的是如果在程序中使用表达式那么"\"也要按照字符串的规定变成"\\"或者在表达式前面加@。
#6
*8808(空间/IV) 中的代码改改作成有正则的就通用了
#7
using System;
using System.Text.RegularExpressions;
class Test
{
static string Replace(string s, string r, char c)
{
string [] split = Regex.Split(s, r);
for (int i = 0; i < split.Length; i++)
{
split[i] = new String(c, split[i].Length);
}
return String.Join(r, split);
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法数字图像";
string r0 = "数字图像";
string s1 = Replace(s0, r0, '■');
Console.WriteLine("原串是: " + s0);
Console.WriteLine("替换为: " + s1);
}
}
/* 程序输出:
原串是: 一些常用的数字图像处理算法数字图像
替换为: ■■■■■数字图像■■■■数字图像
*/
using System.Text.RegularExpressions;
class Test
{
static string Replace(string s, string r, char c)
{
string [] split = Regex.Split(s, r);
for (int i = 0; i < split.Length; i++)
{
split[i] = new String(c, split[i].Length);
}
return String.Join(r, split);
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法数字图像";
string r0 = "数字图像";
string s1 = Replace(s0, r0, '■');
Console.WriteLine("原串是: " + s0);
Console.WriteLine("替换为: " + s1);
}
}
/* 程序输出:
原串是: 一些常用的数字图像处理算法数字图像
替换为: ■■■■■数字图像■■■■数字图像
*/
#8
谢谢以上几位!
#9
string str="一些常用的数字图像处理算法";
System.Text .RegularExpressions .Regex regx=new System.Text.RegularExpressions.Regex ("(.+)(数字图像)(.+)");
string pre=regx.Replace (str,"$1");
string next=regx.Replace(str,"$3");
this.label1 .Text ="■".PadLeft (pre.Length,'■')+regx.Replace (str,"$2")+"■".PadLeft (next.Length,'■');
System.Text .RegularExpressions .Regex regx=new System.Text.RegularExpressions.Regex ("(.+)(数字图像)(.+)");
string pre=regx.Replace (str,"$1");
string next=regx.Replace(str,"$3");
this.label1 .Text ="■".PadLeft (pre.Length,'■')+regx.Replace (str,"$2")+"■".PadLeft (next.Length,'■');
#10
顶
#11
vivianfdlpw()
不好意思。我结的时候还没有看到你的贴子。
非常感谢!
不好意思。我结的时候还没有看到你的贴子。
非常感谢!
#1
正则表达式
#2
怎么搞?
#3
1、将指定词的位置找出来用作第三步的参数
2、定义一个原字符串长度的■■■■....
3、用replace方法替换■■■■....字符串
多个指定词就replace多次
2、定义一个原字符串长度的■■■■....
3、用replace方法替换■■■■....字符串
多个指定词就replace多次
#4
using System;
class Test
{
static string Replace(string s, string r, char c)
{
return s.Replace(r, new String(c, r.Length));
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法";
string r0 = "一些常用的";
string r1 = "处理算法";
string s1 = Replace(s0, r0, '■');
string s2 = Replace(s1, r1, '■');
Console.WriteLine(s0);
Console.WriteLine(s2);
}
}
/* 程序输出:
一些常用的数字图像处理算法
■■■■■数字图像■■■■
*/
class Test
{
static string Replace(string s, string r, char c)
{
return s.Replace(r, new String(c, r.Length));
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法";
string r0 = "一些常用的";
string r1 = "处理算法";
string s1 = Replace(s0, r0, '■');
string s2 = Replace(s1, r1, '■');
Console.WriteLine(s0);
Console.WriteLine(s2);
}
}
/* 程序输出:
一些常用的数字图像处理算法
■■■■■数字图像■■■■
*/
#5
你的档案部的头儿想要一个工具用来检查重复的单词(如:this this),一个在大量编辑文档的时候通常会遇到的问题。你的工作就是创建一个解决方案:
接受任何数量要检查的文件,报告每个文件中带有重复单词的那些行,突出显示这些重复的单词,同时确保原文件名称和这些行出现在报表中。
跨行检查,找到一行的最后一个单词和下一行开头第一个单词出现重复的情况。
找出重复的单词,不管他们是否大小写不同(如:The the),以及允许在这些重复单词之间含有不同数量的空白字符(空格、制表符、新行等)
找出重复的单词,甚至这些单词被Html标签隔开。(如:…it is <B>very</B> very important.)
要解决上述的实际问题,我们首先要做的就是写出正则表达式,找到我们想要的文本,忽略我们不需要的文本,然后使用我们的C#代码对获取的文本进行处理。
在使用正则表达式之前,你也许多少已经知道什么是正则表达式。甚至你不知道,你几乎可以肯定已经熟悉它的基本概念了。
你知道report.txt是一个具体的文件名称,但是如果你有任何Unix或者DOS/Windows的经验,你也知道“*.txt”可以用来选择多个文件。这种形式的文件名,有一些字符有着特殊的含义。星号意味着匹配任何东西,问号意味着匹配一个字符。如:“*.txt”表示任何文件名以.txt结尾的文件。
文件名称得模式匹配,使用了有限的匹配符。还有当前网络上的搜索引擎也允许使用某些指定的匹配符来进行内容搜索。正则表达式采用丰富的匹配字符,可以处理各种复杂的问题。
首先我们介绍两个位置匹配符:
^ : 表示一行文字的开始位置
$ : 表示一行文字的结束位置
如:表达式:"^Cat", 匹配的单词Cat出现在行的开始处,注意^是一个位置字符,不是要匹配字符的本身。
同样,表达式:"Cat$" 匹配的单词Cat出现来一行的结尾处。
接下来,我们介绍表达式中的方括号"[]", 它表示匹配括号中字符中的一个。如:
表达式:"[0123456789]"将匹配数字0到9的任何一个。
例如:我们要查找文本中,所有包含gray或者grey,那么表达式可以这么写:"gr[ea]y"
[ea]表示匹配ea中的一个,而不是整个ea。
如果我们要匹配html中的<H1><H2><H3><H4><H5><H6>的标签,我们可以写表达式:
"<H[123456]>",但是如果我们要匹配所有字符中的一个呢?哈,问题就来了,在方括号中写出所有的字符?很幸运,我们不必这么做,我们引进范围符号"-";
使用范围符号,我们只需要给出一个范围的边界字符即可,上面的Html例子,我们可以写成:"<H[1-6]>"
而表达式:"[0-9a-zA-Z]"的意思现在清楚了吧?它匹配数字字符,小写26个字母和大写26个字母中的一个。
出现在[]中的"^"符号
如果你看到表达式如:"[^0-9]",此时,"^"不再是前面说的位置符号,这里它是否定符号,表示排除的意思,上面的表达式,表示不包含数字0到9的字符。
思考1:表达式"q[^u]"的意思。假如有下列的单词,那些将被匹配?
Iraqi
Iraqian
miqra
qasida
qintar
qoph
zaqqum
除了范围字符的表示之外,还有一个是点字符".",点字符出现在表达式中,表示匹配任何字符。
如表达式:"07.04.76"将匹配:
形如:07/04/76, 07-04-76,07.04.76。
如果我们需要在某些字符中可选择,我们可以采用选项字符"|":
选项字符有“或"的意思,比如表达式:"[Bob|Robert]"则表示Bob或者Robert将被匹配。
现在看我们前面提到的表达式:"gr[ea]y" ,利用选项字符我们可以写作"grey|gray",它们是相同的。
圆括号的使用:圆括号在表达式中也是被作为元字符使用,如前面的表达式,我们可以写成:"gr(e|a)y",这里的圆括号是必须的,如果没有圆括号,那么表达式"gre|ay"将匹配gre或者ay,这不是我们想要的结果。如果你还不是很清楚,让我们看一下下面的例子:
在电子邮件中查找所有以From:或者Subject:或者Date:开头的行,我们比较下面的两个表达式:
表达式1:"^From|Subject|Data: "
表达式2:"^(From|Subject|Data): "
哪一个是我们想要的?
很明显,表达式1的结果不是我们想要的结果,它匹配的将是:From或者Subjec或者Data: ,表达式2使用圆括符,就能满足我们的需要。
单词边界
我们已经可以匹配出现在行首和行尾的字符,那么如果我们想定位的不仅仅是行首或者行尾呢?我们需要引入单词边界符号,单词边界符号是:"\b",斜杠不可省略,否则变成匹配字母b。使用单词边界符号,我们可以定位匹配的位置必须出现在一个单词的开始或者结尾部分,而不是在单词的中间。例如:"\bis\b"表达式在字符串"This is a cat."中将匹配单词"is"而不会匹配单词"This"中的"is"。
字符串边界符号
除了上述的位置符号,如果我们要匹配的是整个字符串(含多个单词)那么我们可以使用下面的两个符号:
\A :表示字符串的开始处;
\z :表示字符串的结束处。
表达式:"\AThis is a cat\z"将匹配这个字符串"This is a cat"。
使用边界定位符号,这里要提到一个重要的概念,那就是单词字符,单词字符表示可以构成单词的字符,它们是[a-zA-Z0-9]中的任意一个字符。所以上面的表达式也会在句子"This is a cat."得到匹配。匹配的结果不包含句号。
重复数量符号
让我们看表达式:"Colou?r", 这个表达式中出现了我们还没有见过的问号,(这个问号和文件名称匹配的问号意义不同),它表示符号前面的一个字符可以被重复的次数,"?"表示0次或者1次,前面的表达式中问号表示u可以出现0或1次,所以它将匹配"Color"或者"Colour"。
下面是其他的重复数量符号:
+ :表示1次或者多次
* :表示0次或者多次
例如我们要表示一或多个空格,我们可以写表达式:" +";
如果要表示具体次数呢?我们引入花括符{}。
{n} : n是具体的数字,表示重复n次。
{n,m}: 表示最少那次,最多m次。
这些符号都限定了符号前面一个字符的匹配次数。但是如果你想重复多个字符,比如一个单词,那么怎么办?我们再次使用圆括号,前面我们把圆括号作为选项的范围符号,这里是圆括的另外一种使用方法,它被表示为一个组,例如表达式:“(this)"这里的this就是一个组,那么问题就好办了,重复数量符号可以用来表示它前面一个组的重复次数。
现在回到查找重复单词的问题,假如我们要找到“the the”,根据我们迄今为止学到的知识,我们可以写出表达式:
"\bthe +the\b"
表达式的意思是匹配两个the中间有一个或多个空格隔开。
同样,我们还可以写成:
"\b(the +){2}"
但是如果要找全部可能的重复单词呢?我们目前的知识还不足以解决这个问题,下面我们引进反向引用的概念,我们已经看到圆括号可以作为组的边界,一个表达式中可以有多个被圆括号限定的组,根据它们出现的次序,这些组缺省的被分配了一个组号,第一个出现的组号为1号,依次类推。那么反向引用就是可以在之后的表达式的位置上是使用"\n"来引用这个组,这里n是被引用的组号。反向引用就像是程序中的变量一样,下面我们看具体的例子:
前面的单词重复表达式,现在我们采用反向引用可以写做:
"\b(the) +\1\b"
现在,如果我们要匹配所有的重复单词,我们就可以改写表达式为:
"\b([a-zA-Z]+) +\1\b"
最后一个问题是,如果我们要匹配的字符是正则表达式中的符号,怎么办?对,使用转义符号"\", 例如如果你要匹配一个小数点,那么你可以:"\.",还要注意的是如果在程序中使用表达式那么"\"也要按照字符串的规定变成"\\"或者在表达式前面加@。
接受任何数量要检查的文件,报告每个文件中带有重复单词的那些行,突出显示这些重复的单词,同时确保原文件名称和这些行出现在报表中。
跨行检查,找到一行的最后一个单词和下一行开头第一个单词出现重复的情况。
找出重复的单词,不管他们是否大小写不同(如:The the),以及允许在这些重复单词之间含有不同数量的空白字符(空格、制表符、新行等)
找出重复的单词,甚至这些单词被Html标签隔开。(如:…it is <B>very</B> very important.)
要解决上述的实际问题,我们首先要做的就是写出正则表达式,找到我们想要的文本,忽略我们不需要的文本,然后使用我们的C#代码对获取的文本进行处理。
在使用正则表达式之前,你也许多少已经知道什么是正则表达式。甚至你不知道,你几乎可以肯定已经熟悉它的基本概念了。
你知道report.txt是一个具体的文件名称,但是如果你有任何Unix或者DOS/Windows的经验,你也知道“*.txt”可以用来选择多个文件。这种形式的文件名,有一些字符有着特殊的含义。星号意味着匹配任何东西,问号意味着匹配一个字符。如:“*.txt”表示任何文件名以.txt结尾的文件。
文件名称得模式匹配,使用了有限的匹配符。还有当前网络上的搜索引擎也允许使用某些指定的匹配符来进行内容搜索。正则表达式采用丰富的匹配字符,可以处理各种复杂的问题。
首先我们介绍两个位置匹配符:
^ : 表示一行文字的开始位置
$ : 表示一行文字的结束位置
如:表达式:"^Cat", 匹配的单词Cat出现在行的开始处,注意^是一个位置字符,不是要匹配字符的本身。
同样,表达式:"Cat$" 匹配的单词Cat出现来一行的结尾处。
接下来,我们介绍表达式中的方括号"[]", 它表示匹配括号中字符中的一个。如:
表达式:"[0123456789]"将匹配数字0到9的任何一个。
例如:我们要查找文本中,所有包含gray或者grey,那么表达式可以这么写:"gr[ea]y"
[ea]表示匹配ea中的一个,而不是整个ea。
如果我们要匹配html中的<H1><H2><H3><H4><H5><H6>的标签,我们可以写表达式:
"<H[123456]>",但是如果我们要匹配所有字符中的一个呢?哈,问题就来了,在方括号中写出所有的字符?很幸运,我们不必这么做,我们引进范围符号"-";
使用范围符号,我们只需要给出一个范围的边界字符即可,上面的Html例子,我们可以写成:"<H[1-6]>"
而表达式:"[0-9a-zA-Z]"的意思现在清楚了吧?它匹配数字字符,小写26个字母和大写26个字母中的一个。
出现在[]中的"^"符号
如果你看到表达式如:"[^0-9]",此时,"^"不再是前面说的位置符号,这里它是否定符号,表示排除的意思,上面的表达式,表示不包含数字0到9的字符。
思考1:表达式"q[^u]"的意思。假如有下列的单词,那些将被匹配?
Iraqi
Iraqian
miqra
qasida
qintar
qoph
zaqqum
除了范围字符的表示之外,还有一个是点字符".",点字符出现在表达式中,表示匹配任何字符。
如表达式:"07.04.76"将匹配:
形如:07/04/76, 07-04-76,07.04.76。
如果我们需要在某些字符中可选择,我们可以采用选项字符"|":
选项字符有“或"的意思,比如表达式:"[Bob|Robert]"则表示Bob或者Robert将被匹配。
现在看我们前面提到的表达式:"gr[ea]y" ,利用选项字符我们可以写作"grey|gray",它们是相同的。
圆括号的使用:圆括号在表达式中也是被作为元字符使用,如前面的表达式,我们可以写成:"gr(e|a)y",这里的圆括号是必须的,如果没有圆括号,那么表达式"gre|ay"将匹配gre或者ay,这不是我们想要的结果。如果你还不是很清楚,让我们看一下下面的例子:
在电子邮件中查找所有以From:或者Subject:或者Date:开头的行,我们比较下面的两个表达式:
表达式1:"^From|Subject|Data: "
表达式2:"^(From|Subject|Data): "
哪一个是我们想要的?
很明显,表达式1的结果不是我们想要的结果,它匹配的将是:From或者Subjec或者Data: ,表达式2使用圆括符,就能满足我们的需要。
单词边界
我们已经可以匹配出现在行首和行尾的字符,那么如果我们想定位的不仅仅是行首或者行尾呢?我们需要引入单词边界符号,单词边界符号是:"\b",斜杠不可省略,否则变成匹配字母b。使用单词边界符号,我们可以定位匹配的位置必须出现在一个单词的开始或者结尾部分,而不是在单词的中间。例如:"\bis\b"表达式在字符串"This is a cat."中将匹配单词"is"而不会匹配单词"This"中的"is"。
字符串边界符号
除了上述的位置符号,如果我们要匹配的是整个字符串(含多个单词)那么我们可以使用下面的两个符号:
\A :表示字符串的开始处;
\z :表示字符串的结束处。
表达式:"\AThis is a cat\z"将匹配这个字符串"This is a cat"。
使用边界定位符号,这里要提到一个重要的概念,那就是单词字符,单词字符表示可以构成单词的字符,它们是[a-zA-Z0-9]中的任意一个字符。所以上面的表达式也会在句子"This is a cat."得到匹配。匹配的结果不包含句号。
重复数量符号
让我们看表达式:"Colou?r", 这个表达式中出现了我们还没有见过的问号,(这个问号和文件名称匹配的问号意义不同),它表示符号前面的一个字符可以被重复的次数,"?"表示0次或者1次,前面的表达式中问号表示u可以出现0或1次,所以它将匹配"Color"或者"Colour"。
下面是其他的重复数量符号:
+ :表示1次或者多次
* :表示0次或者多次
例如我们要表示一或多个空格,我们可以写表达式:" +";
如果要表示具体次数呢?我们引入花括符{}。
{n} : n是具体的数字,表示重复n次。
{n,m}: 表示最少那次,最多m次。
这些符号都限定了符号前面一个字符的匹配次数。但是如果你想重复多个字符,比如一个单词,那么怎么办?我们再次使用圆括号,前面我们把圆括号作为选项的范围符号,这里是圆括的另外一种使用方法,它被表示为一个组,例如表达式:“(this)"这里的this就是一个组,那么问题就好办了,重复数量符号可以用来表示它前面一个组的重复次数。
现在回到查找重复单词的问题,假如我们要找到“the the”,根据我们迄今为止学到的知识,我们可以写出表达式:
"\bthe +the\b"
表达式的意思是匹配两个the中间有一个或多个空格隔开。
同样,我们还可以写成:
"\b(the +){2}"
但是如果要找全部可能的重复单词呢?我们目前的知识还不足以解决这个问题,下面我们引进反向引用的概念,我们已经看到圆括号可以作为组的边界,一个表达式中可以有多个被圆括号限定的组,根据它们出现的次序,这些组缺省的被分配了一个组号,第一个出现的组号为1号,依次类推。那么反向引用就是可以在之后的表达式的位置上是使用"\n"来引用这个组,这里n是被引用的组号。反向引用就像是程序中的变量一样,下面我们看具体的例子:
前面的单词重复表达式,现在我们采用反向引用可以写做:
"\b(the) +\1\b"
现在,如果我们要匹配所有的重复单词,我们就可以改写表达式为:
"\b([a-zA-Z]+) +\1\b"
最后一个问题是,如果我们要匹配的字符是正则表达式中的符号,怎么办?对,使用转义符号"\", 例如如果你要匹配一个小数点,那么你可以:"\.",还要注意的是如果在程序中使用表达式那么"\"也要按照字符串的规定变成"\\"或者在表达式前面加@。
#6
*8808(空间/IV) 中的代码改改作成有正则的就通用了
#7
using System;
using System.Text.RegularExpressions;
class Test
{
static string Replace(string s, string r, char c)
{
string [] split = Regex.Split(s, r);
for (int i = 0; i < split.Length; i++)
{
split[i] = new String(c, split[i].Length);
}
return String.Join(r, split);
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法数字图像";
string r0 = "数字图像";
string s1 = Replace(s0, r0, '■');
Console.WriteLine("原串是: " + s0);
Console.WriteLine("替换为: " + s1);
}
}
/* 程序输出:
原串是: 一些常用的数字图像处理算法数字图像
替换为: ■■■■■数字图像■■■■数字图像
*/
using System.Text.RegularExpressions;
class Test
{
static string Replace(string s, string r, char c)
{
string [] split = Regex.Split(s, r);
for (int i = 0; i < split.Length; i++)
{
split[i] = new String(c, split[i].Length);
}
return String.Join(r, split);
}
static void Main()
{
string s0 = "一些常用的数字图像处理算法数字图像";
string r0 = "数字图像";
string s1 = Replace(s0, r0, '■');
Console.WriteLine("原串是: " + s0);
Console.WriteLine("替换为: " + s1);
}
}
/* 程序输出:
原串是: 一些常用的数字图像处理算法数字图像
替换为: ■■■■■数字图像■■■■数字图像
*/
#8
谢谢以上几位!
#9
string str="一些常用的数字图像处理算法";
System.Text .RegularExpressions .Regex regx=new System.Text.RegularExpressions.Regex ("(.+)(数字图像)(.+)");
string pre=regx.Replace (str,"$1");
string next=regx.Replace(str,"$3");
this.label1 .Text ="■".PadLeft (pre.Length,'■')+regx.Replace (str,"$2")+"■".PadLeft (next.Length,'■');
System.Text .RegularExpressions .Regex regx=new System.Text.RegularExpressions.Regex ("(.+)(数字图像)(.+)");
string pre=regx.Replace (str,"$1");
string next=regx.Replace(str,"$3");
this.label1 .Text ="■".PadLeft (pre.Length,'■')+regx.Replace (str,"$2")+"■".PadLeft (next.Length,'■');
#10
顶
#11
vivianfdlpw()
不好意思。我结的时候还没有看到你的贴子。
非常感谢!
不好意思。我结的时候还没有看到你的贴子。
非常感谢!