求教:正则表达式跨行匹配

mike77 2006-08-27 11:41:49
下面的文本,
<KEY>
cccc
dddd
<KEY>
ffff
gggg
<KEY>
hhhh
iiii
如何写正则表达式把两个<KEY>之间和最后一个<KEY>到字符串末尾的内容分别提取出来,即
分别产生三个字符串:
1.
cccc
dddd
2.
ffff
gggg
3.
hhhh
iiii

请各位指教,多谢了。。。

...全文
1461 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_123du_com 2006-08-30
  • 打赏
  • 举报
回复
不知道你是怎么测的......

看来你那里的.NET和我这里的.NET有不同行为。
Ivony 2006-08-30
  • 打赏
  • 举报
回复
刚看明白……

@"<key>.*?((<key>)|$)"
lyfer 2006-08-30
  • 打赏
  • 举报
回复
呵呵,来看原帖的
mike77 2006-08-29
  • 打赏
  • 举报
回复
小总结:
● Ivony提出的@"<key>.*?</key>"方法应该是@"<key>.*</key>"改进过来,改正了“贪婪”算法匹配整个首尾<key>之间的结果。但是它还有一个缺陷是,测试文本中的标志没有</key>而是都是<key>。改用<KEY>[\s\S]*?<KEY>也只能匹配第一个<key>和第二个<key>之间的内容。
● www_123du_com和jingtao_zhou提供的方法测了,也只能匹配第一个<key>和第二个<key>之间的内容。
● 看来mobydick的方法现在看来是一个比较简单易行的方法。有那么一丁点美中不足是没有使用标准的正则匹配:)
● sswater的方法产生的想要的结果。推荐的那个网址也很不错哦,强烈建议大家去捧场
因此,目前可用的两个方法,一是用split,二是 <KEY>((.|\n)*?)((?=<KEY>)|$)
<KEY>((.|\n)*?)((?=<KEY>)|$)
最后谢谢各位热心帮助
Ivony 2006-08-29
  • 打赏
  • 举报
回复
单行模式是将多行视为单行,多行模式是将每一行视为单独的字符串。
www_123du_com 2006-08-29
  • 打赏
  • 举报
回复
看看我的呵呵
GoogleDotNet 2006-08-28
  • 打赏
  • 举报
回复
<KEY>[\W\w]*?<KEY>[\W\w]*?<KEY>

在*后面加个?匹配最短串
chinadforce 2006-08-28
  • 打赏
  • 举报
回复
关注
didi_hb_005 2006-08-28
  • 打赏
  • 举报
回复
up

---------------------------------------------------------------------------------------------
腰缠70元到月入近10万
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=453

IT工程师 毕业4年我年薪涨到30万
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=511

26岁青年坐拥千万域名资产 从小玩家变成CEO
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=515

程序员的酸甜苦辣:告别Coding
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=341

从月薪3500到700万(一)
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=170

网络草根月赚3000的十种方法
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=517

如果我是女的 我肯定不会嫁给做网站的
http://www.hunbei.com.cn/Article/ArticleShow.asp?ArticleID=512
mike77 2006-08-28
  • 打赏
  • 举报
回复
Multiline标志已经用了,关键在于如果用<KEY>[\W\w]*<KEY>来匹配的话,由于“贪婪”算法会匹配第一个<KEY>到最后一个<KEY>的所有内容,也许有更巧妙的办法,请lxhvc() 兄明示
daishengs 2006-08-28
  • 打赏
  • 举报
回复
嘿嘿,我只知道,如果指定了Multiline属性,可以进行跨行的。
ywz65567 2006-08-28
  • 打赏
  • 举报
回复
这样子应该可以吧?你去试一下
string s = "<key>\naaa\nbbb\n<key>\nccc\nddd\n<key>\neee\nfff";
Regex re = new Regex("<key>\n");
string [] rString = re.Split(s);
GoogleDotNet 2006-08-28
  • 打赏
  • 举报
回复
那就手工来出来,用 String.SubString()
fds2003 2006-08-28
  • 打赏
  • 举报
回复
帮顶!
Ivony 2006-08-28
  • 打赏
  • 举报
回复
楼主的结果也不知道怎么出来的,这里应该用单行模式!

真是乱七八糟……
@"<key>.*?</key>"

然后用Regex.Matches方法
cancerser 2006-08-28
  • 打赏
  • 举报
回复
string[] array = null;
try {
array = Regex.Split(yourStr, "<KEY>\r\n");
} catch{}
www_123du_com 2006-08-28
  • 打赏
  • 举报
回复
string str = "(?<=<KEY>).*?(?=(<KEY>|$))";
string str2 = "<KEY>\r\ncccc\r\ndddd\r\n<KEY>\r\nffff\r\ngggg\r\n<KEY>\r\nhhhh\r\niiii";

MatchCollection mc = Regex.Matches(str2,str,RegexOptions.Singleline);
foreach (Match m in mc)
{
string s6 = m.Value.Trim();
}
www_123du_com 2006-08-28
  • 打赏
  • 举报
回复
lxhvc() ( ) 信誉:100 Blog 2006-08-27 23:46:00 得分: 0


Multiline
m
指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。
_____________________________

这里不应该指定Multiline标志。
jingtao_zhou 2006-08-28
  • 打赏
  • 举报
回复
System.Text.RegularExpressions.Regex reg=new Regex(@"(?<=(<key>))[\s\S]+?(?=(<key>))");
dlzhangln 2006-08-28
  • 打赏
  • 举报
回复
同意楼上
加载更多回复(5)

110,571

社区成员

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

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

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