当前位置:编程学习 > C#/ASP.NET >>

正则文字提取

--------------------编程问答--------------------

void Main()
{
string s=" goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的";
GroupCollection m= Regex.Match(s,@"(?i)(.*)\<\w+\>(.*?)\(.*\)(.*),(.*)\[.*\](.*),(.*)").Groups;
 
Console.WriteLine(m[1].Value+m[2].Value+m[3].Value);
Console.WriteLine(m[1].Value+m[4].Value+m[5].Value);
Console.WriteLine(m[1].Value+m[6].Value+m[7].Value);
}

/*
 goop 信笺上方的文字
 goop 印有抬头的信笺
 goop 文盲的

*/
--------------------编程问答-------------------- 迷糊???嘛意思 --------------------编程问答-------------------- 下次建议你 
在帖子标题上 写上 [正则] 二字

那么会有一4星和一5星的 两家伙

就会很快来到你的帖子里给你解答问题了
--------------------编程问答--------------------
引用 3 楼 q107770540 的回复:
下次建议你 
在帖子标题上 写上 [正则] 二字

那么会有一4星和一5星的 两家伙

就会很快来到你的帖子里给你解答问题了
哈哈~~~太幽默了! --------------------编程问答-------------------- 是可以弄出来 但是问题又来了 我有很多这样的数据啊 例如:

goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen   [生]泛子,胚芽(一种假设的原生质粒)
panglossian   过分乐观的,认为一切都趋于至善的 过分乐观者

要把这一段提取成:
goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的
pangen 泛子
pangen 胚芽
panglossian 过分乐观的
panglossian 认为一切都趋于至善的 
panglossian 过分乐观者


类似这样的数据很多 我该怎么办啊 ? --------------------编程问答--------------------
引用 3 楼 q107770540 的回复:
下次建议你 
在帖子标题上 写上 [正则] 二字

那么会有一4星和一5星的 两家伙

就会很快来到你的帖子里给你解答问题了

哈哈 --------------------编程问答--------------------


//不要太依赖正则  有些不用正则也是可以实现的
//比如这句的分割:
void Main()
{
string s=" panglossian 过分乐观的,认为一切都趋于至善的 过分乐观者";
string[] ss=s.Split(new char[]{' ',','},StringSplitOptions.RemoveEmptyEntries);

Console.WriteLine(ss[0] +" " +ss[1]);
Console.WriteLine(ss[0] +" " +ss[2]);
Console.WriteLine(ss[0] +" " +ss[3]);
}

/*
panglossian 过分乐观的
panglossian 认为一切都趋于至善的
panglossian 过分乐观者

*/

--------------------编程问答-------------------- 哈哈..帖子标题这么快就换了? --------------------编程问答-------------------- ...
貌似有答案了。今天忙。 --------------------编程问答-------------------- 不是啊前辈们  我现在是有很多这样的数据  他们是用文件流读出来的  读出来的数据就是以下(有很多长度标点都是不固定的):


goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen [生]泛子,胚芽(一种假设的原生质粒)
panglossian 过分乐观的,认为一切都趋于至善的 过分乐观者



要把这一段提取成以下模式 在用文件流打出来:
goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的
pangen 泛子
pangen 胚芽
panglossian 过分乐观的
panglossian 认为一切都趋于至善的  
panglossian 过分乐观者
--------------------编程问答--------------------
   public static void Main()
    {
        string temp = @"goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
                        pangen [生]泛子,胚芽(一种假设的原生质粒)
                        panglossian 过分乐观的,认为一切都趋于至善的 过分乐观者";

        MatchCollection mc = Regex.Matches(temp, "^.+$",RegexOptions.Multiline);
        foreach (Match m in mc)
        {
            string[] t = m.Value.Trim().Split(' ', ',');
            Console.WriteLine(t.Length);
        }
    }

得到t了 你会处理了吧 --------------------编程问答-------------------- try

    public static void Test()
    {
        string yourStr = @"goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen [生]泛子,胚芽(一种假设的原生质粒)
panglossian 过分乐观的,认为一切都趋于至善的 过分乐观者
";
        StringBuilder builder = new StringBuilder();
        string result = Regex.Replace(yourStr, @"(?m)^(\w+)\s*(?:(?:<[^>]*>|\([^()]*\)|\[[^[]]*\]|[,.?!\s])([^()<>\[\]\r\n,.?!]+))+",
            delegate(Match m)
            {
                builder.Remove(0, builder.Length);//清理
                foreach (Capture c in m.Groups[2].Captures)
                {
                    builder.AppendLine(m.Groups[1].Value + " " + c.Value);
                }
                return builder.ToString();
            });
        Console.WriteLine(result);
    }

result就是你要的结果。 --------------------编程问答-------------------- er..
规则理解错了。修改一下
测试

    public static void Test()
    {
        string yourStr = @"goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen [生]泛子,胚芽(一种假设的原生质粒)
panglossian 过分乐观的,认为一切都趋于至善的 过分乐观者
";
        StringBuilder builder = new StringBuilder();
        string result = Regex.Replace(yourStr, @"(?m)^(\w+)\s*(?:(?:<[^>]*>|[,.?!\s])([^<>\r\n,.?!\s]+))+",
            delegate(Match m)
            {
                builder.Remove(0, builder.Length);//清理
                foreach (Capture c in m.Groups[2].Captures)
                {
                    builder.AppendLine(m.Groups[1].Value + " " + Regex.Replace(c.Value,@"\([^()]*\)|\[[^\[\]]*\]",""));
                }
                return builder.ToString();
            });
        Console.WriteLine(result);
    }

输出

goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的

pangen 泛子
pangen 胚芽

panglossian 过分乐观的
panglossian 认为一切都趋于至善的
panglossian 过分乐观者
--------------------编程问答-------------------- 如果还觉得和你结果不同。吧连续的2个回车换行替换掉就和你描述的结果完全一致了。  --------------------编程问答-------------------- 我怎么就这么爱你们呢!~~~~~~~~~ --------------------编程问答--------------------

wuyazhe 前辈 麻烦你把这段提取下呗 我做的时候有点问题


goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen [生]泛子,胚芽(一种假设的原生质粒)
panglossian 过分乐观的,认为一切都趋于至善的 过分乐观者
striped-pants   过于注重形式的,刻板的,礼貌上的
stripfilm   幻灯片 (幻灯)片带,片条
stripline   带状线
stripling   年轻人,小伙子
stripper   清除的人,剥离器
stript   <罕>strip 的过去式和过去分词
striptease   脱衣舞 跳脱衣舞 --------------------编程问答-------------------- 你想要什么结果?我觉得你规则会很不明确,比如
stript <罕>strip 的过去式和过去分词
按空格分隔的话就不合理了。
striped-pants 过于注重形式的,刻板的,礼貌上的
这么说逗号也是分隔的条件之一?
--------------------编程问答--------------------
    private static void TestRegex02()
    {
        string yourStr = @"goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen [生]泛子,胚芽(一种假设的原生质粒)
panglossian 过分乐观的,认为一切都趋于至善的 过分乐观者
striped-pants 过于注重形式的,刻板的,礼貌上的
stripfilm 幻灯片 (幻灯)片带,片条
stripline 带状线
stripling 年轻人,小伙子
stripper 清除的人,剥离器
stript <罕>strip 的过去式和过去分词
striptease 脱衣舞 跳脱衣舞
";
        StringBuilder builder = new StringBuilder();
        string result = Regex.Replace(yourStr, @"(?m)^(\S+)\s*(?:(?:[,.?!\s]|<[^>]*>)([^<>\r\n,.?!\s]+))+",
            delegate(Match m)
            {
                builder.Remove(0, builder.Length);//清理
                foreach (Capture c in m.Groups[2].Captures)
                {
                    builder.AppendLine(m.Groups[1].Value + " " + Regex.Replace(c.Value, @"\([^()]*\)|\[[^\[\]]*\]", ""));
                }
                return builder.ToString();
            });
        Console.WriteLine(result);
    }

输出

goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的

pangen 泛子
pangen 胚芽

panglossian 过分乐观的
panglossian 认为一切都趋于至善的
panglossian 过分乐观者

striped-pants 过于注重形式的
striped-pants 刻板的
striped-pants 礼貌上的

stripfilm 幻灯片
stripfilm 片带
stripfilm 片条

stripline 带状线

stripling 年轻人
stripling 小伙子

stripper 清除的人
stripper 剥离器

stript strip
stript 的过去式和过去分词

striptease 脱衣舞
striptease 跳脱衣舞

--------------------编程问答-------------------- 刚才没考虑到短语 还有短语这种类型


用正则将以下这几种类型 :

goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
striped-pants 过于注重形式的,刻板的,礼貌上的
a beam in 's own eye   某人自身的大缺点
a beaten track   踏出的路,常规,惯例
gosport   戈斯波特[英国英格兰南部港市]; (飞机座舱间的)通话软管


提取成:

goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的
striped-pants 过于注重形式的
striped-pants 刻板的
striped-pants 礼貌上的
a beam in 's own eye 某人自身的大缺点
a beaten track 踏出的路
a beaten track 常规
a beaten track 惯例
gosport 戈斯波特
gosport 通话软管


--------------------编程问答-------------------- 这次逍遥该疯了
引用 19 楼 mytalentking 的回复:
刚才没考虑到短语 还有短语这种类型


用正则将以下这几种类型 :

goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
striped-pants 过于注重形式的,刻板的,礼貌上的
a beam in 's own eye 某人自身的大缺点
a beaten track 踏出的路,常规,惯例
gosport 戈斯波特[英国英格兰南部港市]; (飞机座舱间的)通……
--------------------编程问答-------------------- 是我 我也觉得很对不起他 但是没办法 真不会用正则啊 --------------------编程问答-------------------- 如果特定环境,认为就是英文的话。
测试

    private static void TestRegex03()
    {
        string yourStr = @"goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
striped-pants 过于注重形式的,刻板的,礼貌上的
a beam in 's own eye 某人自身的大缺点
a beaten track 踏出的路,常规,惯例
gosport 戈斯波特[英国英格兰南部港市]; (飞机座舱间的)通话软管
";
        StringBuilder builder = new StringBuilder();
        string result = Regex.Replace(yourStr, @"(?im)^([a-z'\- ]+)\s*(?:(?:[,.?!\s]|<[^>]*>)([^<>\r\n,.?!\s]+))+",
            delegate(Match m)
            {
                builder.Remove(0, builder.Length);//清理
                foreach (Capture c in m.Groups[2].Captures)
                {
                    builder.AppendLine(m.Groups[1].Value + " " + Regex.Replace(c.Value, @"\([^()]*\)|\[[^\[\]]*\]|;", ""));
                }
                return builder.ToString();
            });
        Console.WriteLine(result);
    }


输出

goop  信笺上方的文字
goop  印有抬头的信笺
goop  文盲的

striped-pants 过于注重形式的
striped-pants 刻板的
striped-pants 礼貌上的

a beam in 's own eye 某人自身的大缺点

a beaten track 踏出的路
a beaten track 常规
a beaten track 惯例

gosport 戈斯波特
gosport 通话软管

--------------------编程问答-------------------- 正则就是干这事的,疯不了。 --------------------编程问答-------------------- 但是这段用文件流 输入进来后就 变成这样了:

goop  信笺上方的文字
goop  印有抬头的信笺
goop  文盲的

striped-pants 过于注重形式的,刻板的,礼貌上的
a beam
a in
a 's
a own
a eye
a 某人自身的大缺点

a beaten
a track
a 踏出的路
a 常规
a 惯例

gosport 戈斯波特
gosport 通话软管 --------------------编程问答-------------------- 我已经贴了完整代码和输出内容。对不对你自己动手试一下就有结果。
24楼你贴的逗号是全角的,除非你原文本不同。我只保证在你给的例子和你的规则下正确,规则不同的话要重新描述你的规则。 --------------------编程问答--------------------
引用 3 楼 q107770540 的回复:
下次建议你 
在帖子标题上 写上 [正则] 二字

那么会有一4星和一5星的 两家伙

就会很快来到你的帖子里给你解答问题了


最近工作和生活两忙,只能拿出点时间来处理下版务,木有时间回答问题

一个家伙来了,另一个家伙选择飘过。。。 --------------------编程问答-------------------- 我多打点要不  规制不够用。。  帮忙再解决一下把

用正则把以下:

air fleet   机群,航空机队
air force   空军,美国空军
air gas   风煤气(含有空气的煤气,供点灯,取暖用)
air gun   气枪,空气枪
air hammer   气锤
air hole   气孔,河中不冰冻部分
athymic   [医]无胸腺的
atilt   挺着长矛,摆着冲刺的架势,倾斜
atingle   刺痛的,兴奋的,疼痛的
atishoo   阿嚏(打喷嚏的拟声)
atka fish   [鱼](产于北太平洋,特别是阿留申群岛海域的)多线鱼
atka mackerel   [鱼](产于北太平洋,特别是阿留申群岛海域的)多线鱼
striped-pants 过于注重形式的,刻板的,礼貌上的
stripssed-pasdfnts 过于注重形式的,刻板的,礼貌上的
goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
goops <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen [生]泛子,胚芽(一种假设的原生质粒)
pangens [生]泛子,胚芽(一种假设的原生质粒)




提取成以下:



air fleet   机群
air fleet    航空机队
air force   空军
air force   美国空军
air gas   风煤气
air gun   气枪
air gun      空气枪
air hammer   气锤
air hole   气孔
air hole     河中不冰冻部分
athymic   无胸腺的
atilt   挺着长矛
atilt    摆着冲刺的架势
atilt    倾斜
atingle   刺痛的
atingle      兴奋的
atingle  疼痛的
atishoo   阿嚏
atka fish   多线鱼
atka mackerel   产于北太平洋
atka mackerel   特别是
atka mackerel   多线鱼
striped-pants 礼貌上的
striped-pants 过于注重形式的
striped-pants 刻板的,
stripssed-pasdfnts 过于注重形式的,刻板的,礼貌上的
stripssed-pasdfnts 刻板的
stripssed-pasdfnts 礼貌上的
goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的
goops 信笺上方的文字
goops 印有抬头的信笺
goops 文盲的
pangen 泛子
pangen 胚芽
pangens 泛子
pangens 胚芽 --------------------编程问答-------------------- 你的规则实在不明确。
atka mackerel [鱼](产于北太平洋,特别是阿留申群岛海域的)多线鱼
这个你怎么规则中海能保留()中的内容呢。哪些保留哪些不保留这个规则不明确的话软件不用正则都无法识别的吧。
如果不是这个。其他的都对的上,你有些顺序贴错了。
测试

    private static void TestRegex04()
    {
        string yourStr = @"air fleet 机群,航空机队
air force 空军,美国空军
air gas 风煤气(含有空气的煤气,供点灯,取暖用)
air gun 气枪,空气枪
air hammer 气锤
air hole 气孔,河中不冰冻部分
athymic [医]无胸腺的
atilt 挺着长矛,摆着冲刺的架势,倾斜
atingle 刺痛的,兴奋的,疼痛的
atishoo 阿嚏(打喷嚏的拟声)
atka fish [鱼](产于北太平洋,特别是阿留申群岛海域的)多线鱼
atka mackerel [鱼](产于北太平洋,特别是阿留申群岛海域的)多线鱼
striped-pants 过于注重形式的,刻板的,礼貌上的
stripssed-pasdfnts 过于注重形式的,刻板的,礼貌上的
goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
goops <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
pangen [生]泛子,胚芽(一种假设的原生质粒)
pangens [生]泛子,胚芽(一种假设的原生质粒)
";
        StringBuilder builder = new StringBuilder();
        string result = Regex.Replace(yourStr, @"(?im)^([a-z'\- ]+)\s*(?:(?:<[^>]*>|(?<!\([^)]*)[,\s])((?:\([^)]*\)|[^\r\n,]+?)+))+",
            delegate(Match m)
            {
                builder.Remove(0, builder.Length);//清理
                foreach (Capture c in m.Groups[2].Captures)
                {
                    builder.AppendLine(m.Groups[1].Value + " " + Regex.Replace(c.Value, @"\([^()]*\)|\[[^\[\]]*\]|;", ""));
                }
                return builder.ToString();
            });
        Clipboard.SetText(result);
        Console.WriteLine(result);
    }

输出

air fleet 机群
air fleet 航空机队

air force 空军
air force 美国空军

air gas 风煤气

air gun 气枪
air gun 空气枪

air hammer 气锤

air hole 气孔
air hole 河中不冰冻部分

athymic 无胸腺的

atilt 挺着长矛
atilt 摆着冲刺的架势
atilt 倾斜

atingle 刺痛的
atingle 兴奋的
atingle 疼痛的

atishoo 阿嚏

atka fish 多线鱼

atka mackerel 多线鱼

striped-pants 过于注重形式的
striped-pants 刻板的
striped-pants 礼貌上的

stripssed-pasdfnts 过于注重形式的
stripssed-pasdfnts 刻板的
stripssed-pasdfnts 礼貌上的

goop  信笺上方的文字
goop  印有抬头的信笺
goop  文盲的

goops  信笺上方的文字
goops  印有抬头的信笺
goops  文盲的

pangen 泛子
pangen 胚芽

pangens 泛子
pangens 胚芽


--------------------编程问答-------------------- 0 0 逍遥!!!!正则是浮云! --------------------编程问答-------------------- 不愧是星级别的呀,膜拜下。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,