我该如何构造一个正则表达式来获得不确定数量的数学
本文关键字:不确定 正则表达式 一个 何构造 | 更新日期: 2023-09-27 18:20:48
作为桌面应用程序的一部分,我正试图从下载的Facebook数据包附带的HTML文件中的HTML列表中提取我的Facebook好友。这个列表就像
<h2>Friends</h2>
<ul>
<li>John Skeet</li>
<li>Donald Knuth</li>
<li>Mark Zuckerberg</li>
.
.
.
</ul>
(除了没有空格,没有换行符;我只是在这个线程中为了美观而这样写的)。所以我会尝试得到John Skeet
、Donald Knuth
、Mark Zuckerberg
。。。从中解脱出来。
注意:列表将是有限的。我一直在写的"…"并不意味着它会无限延续。
到目前为止,我的程序是
private static readonly string _friendsRegex = "<h2>Friends</h2><ul>something</ul>"; // regular expression for matching friends' names
static void Main ( string [] args )
{
try
{
if ( args.Length != 1 ) throw new Exception("Unfriendly.exe expects 1 parameter, the full path the data of your Facebook acount");
using ( StreamReader sr = new StreamReader("/html/friends") )
{
String html = sr.ReadToEnd();
HashSet<string> curfriends = new HashSet<string>();
Regex fregx = new Regex(String.Format(@"{0}",Program._friendsRegex), RegexOptions.Compiled);
foreach (Match thisfriend in fregx.Matches(html))
curfriends.Add(thisfriend.Value);
// ...
}
}
我想知道_friendsRegex
应该是什么,或者是否有可能构建这样一个正则表达式。
您只需使用
<li>([^<]+)<'/li>
并获取捕获组1的匹配项。参见演示
[^<]+
匹配一个或多个不是<
的字符
您可以使用此Regex:<li>([a-zA-Z ]+)</li>
请记住,您需要获得第二个capture group
,第一个是整个比赛。你可以这样得到:
foreach (Match match in fregx.Matches(html))
curfriends.Add(match.Groups[1]);
此正则表达式只匹配使用普通字母和空格的名称,您可以根据需要在[]
之间添加字符,也可以通过将[a-zA-z ]
替换为[^<]
来简单地使用除<
之外的所有字符。