正则文字提取

mytalentking 2010-11-17 09:09:30
用正则把

goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的

提取成 :goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的





谁能为我指点迷境啊?
...全文
268 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
我已经贴了完整代码和输出内容。对不对你自己动手试一下就有结果。
24楼你贴的逗号是全角的,除非你原文本不同。我只保证在你给的例子和你的规则下正确,规则不同的话要重新描述你的规则。
mytalentking 2010-11-17
  • 打赏
  • 举报
回复
但是这段用文件流 输入进来后就 变成这样了:

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 通话软管
兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
正则就是干这事的,疯不了。
兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
如果特定环境,认为就是英文的话。
测试

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 通话软管

mytalentking 2010-11-17
  • 打赏
  • 举报
回复
是我 我也觉得很对不起他 但是没办法 真不会用正则啊
不懂装懂 2010-11-17
  • 打赏
  • 举报
回复
这次逍遥该疯了[Quote=引用 19 楼 mytalentking 的回复:]
刚才没考虑到短语 还有短语这种类型


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

goop <古>信笺上方的(印刷)文字,印有抬头[律]的信笺,文盲的
striped-pants 过于注重形式的,刻板的,礼貌上的
a beam in 's own eye 某人自身的大缺点
a beaten track 踏出的路,常规,惯例
gosport 戈斯波特[英国英格兰南部港市]; (飞机座舱间的)通……
[/Quote]
mytalentking 2010-11-17
  • 打赏
  • 举报
回复
刚才没考虑到短语 还有短语这种类型


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

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 通话软管


兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
你想要什么结果?我觉得你规则会很不明确,比如
stript <罕>strip 的过去式和过去分词
按空格分隔的话就不合理了。
striped-pants 过于注重形式的,刻板的,礼貌上的
这么说逗号也是分隔的条件之一?
mytalentking 2010-11-17
  • 打赏
  • 举报
回复
我怎么就这么爱你们呢!~~~~~~~~~
兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
如果还觉得和你结果不同。吧连续的2个回车换行替换掉就和你描述的结果完全一致了。
兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
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 过分乐观者
兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
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就是你要的结果。
Mr-Jee 2010-11-17
  • 打赏
  • 举报
回复
   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了 你会处理了吧
mytalentking 2010-11-17
  • 打赏
  • 举报
回复
不是啊前辈们 我现在是有很多这样的数据 他们是用文件流读出来的 读出来的数据就是以下(有很多长度标点都是不固定的):


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



要把这一段提取成以下模式 在用文件流打出来:
goop 信笺上方的文字
goop 印有抬头的信笺
goop 文盲的
pangen 泛子
pangen 胚芽
panglossian 过分乐观的
panglossian 认为一切都趋于至善的
panglossian 过分乐观者
兔子-顾问 2010-11-17
  • 打赏
  • 举报
回复
...
貌似有答案了。今天忙。
q107770540 2010-11-17
  • 打赏
  • 举报
回复
哈哈..帖子标题这么快就换了?
q107770540 2010-11-17
  • 打赏
  • 举报
回复


//不要太依赖正则 有些不用正则也是可以实现的
//比如这句的分割:
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 过分乐观者

*/

小慧哥 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 q107770540 的回复:]
下次建议你
在帖子标题上 写上 [正则] 二字

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

就会很快来到你的帖子里给你解答问题了
[/Quote]
哈哈
mytalentking 2010-11-17
  • 打赏
  • 举报
回复
是可以弄出来 但是问题又来了 我有很多这样的数据啊 例如:

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

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


类似这样的数据很多 我该怎么办啊 ?
Mr-Jee 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 q107770540 的回复:]

下次建议你
在帖子标题上 写上 [正则] 二字

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

就会很快来到你的帖子里给你解答问题了
[/Quote]哈哈~~~太幽默了!
加载更多回复(8)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧