在C#中提取以某些字符开头并以某些字符结尾的字符串

5

以下是模式:

string str =
   "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM";

只有以+++++开头并以AMPM结尾的字符串才应该被选中。什么是Regex.split或linq查询模式?


1
接受一个答案,或者至少留下评论表明是否有任何答案对您有帮助 - akhil
5个回答

3
鹰爪子差不多了,但你需要一个最小匹配,而不是贪婪匹配。尝试使用:
[+]{5}.*?(A|P)M

2
我把它压缩成了 \+{5}.*?[AP]M :) - Blorgbeard
@Blorgbeard:是的,这好了一点点。但最重要的是它能正常工作。 - Ben Voigt
确实,所以我给你的答案点了赞,而没有发布我的微小改进 :P - Blorgbeard
@BenVoigt 那太好了...你给一个回答投了反对票,现在当它被纠正时,甚至没有准备花一点时间来点赞它。 - akhil
@akhil:我没有给你的答案投反对票。不管怎样,你的答案仍然存在贪婪的问题。 - Ben Voigt
显示剩余2条评论

3

尝试这个正则表达式:

@"[+]{5}[^\n]+[AP]M"

var str = "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM";
var match = Regex.Match(str, @"[+]{5}[^\n]+[AP]M").Captures[0];
match.Value.Dump(); 

输出:

+++++tom cruise 9:44AM

或者:

@"[+]{5}\D+\d{1,2}:\d{1,2}[AP]M

我推荐使用这个正则表达式。它将匹配直到在xY:xY:AM / PM格式中找到一个小时,其中Y是可选的。测试结果如下:

我推荐使用这个正则表达式。它将匹配直到在xY:xY:AM / PM格式中找到一个小时,其中Y是可选的。测试结果如下:

string str = "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM";
foreach(Match match in Regex.Matches(str, @"[+]{5}\D+\d{1,2}:\d{1,2}[AP]M"))
        Console.WriteLine(match.Value);

输出:

+++++tom cruise 9:44AM
+++++mark taylor 9:21PM

你“推荐”的版本仍然很贪心,可以同时匹配多个条目。 - Ben Voigt

2
正则表达式应该是:
[+]{5}.*AM|[+]{5}.*PM

你可以在这里尝试: http://regexpal.com/ 它的第一个捕获是:
+++++tom cruise 9:44AM

第二个是

+++++mark taylor 9:21PM

1
.* 不是贪婪匹配吗?这样不会返回整个字符串作为一个大的匹配吗? - Ben Voigt
@BenVoigt 我不确定C#的正则表达式默认是什么,但我想应该有一种方法可以使“.*”不贪婪。 但如果这不可能,我相信将“.*”替换为“.+?”就可以解决问题。 - Talon876

0

使用这个:

bool bResult = false;
String strInput = @"+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM";
foreach (string s in strInput.Split(new[]{'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries))
{
    bResult |= Regex.IsMatch(s, @"^[+]+.+[AP]M$");
}

或者获取结果使用:

var listResult = new List<string>();
String strInput = @"+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM";
foreach (string s in strInput.Split(new[]{'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries))
{
    listResult.Add(Regex.Match(s, @"^[+]+(?<result>.+)[AP]M$").Groups["result"].Value);
}

-1

这是精确的正则表达式代码,可以按照您的要求搜索字符串

 string str = "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM asdasd";
        var fileNames = from Match m in Regex.Matches(str, @"\++\++\++\++\++.+(PM|AM)")
                         select m.Value;
        foreach (var s in fileNames)
        {
            Response.Write(s.ToString() + "\r\n");
        }

1
不,它不会。它将查找任何加号序列,而不需要一个长度为5的字符串。 - Ben Voigt
@BenVoigt 这不会将其计为-1。我已经编辑了正则表达式。我想现在更好了。 - akhil
但是如果我不知道字符串中有多少个+++++序列,我该如何在Regex.Matches(str,@"")中指定? - user1502952
@"[+]+.+(PM|AM)" 这将在字符串中搜索任意数量的连续 "+"。 - akhil
@user1502952 那个行得通吗? - akhil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接