正则表达式直到第一次匹配C#并切断字符串

时间:2015-04-18 13:55:03

标签: c# .net regex

这个网站的正则表达式大师,我有一个问题,试图写正则表达式返回第一部分的消息,直到第一场比赛。我正在用C#语言编程并使用参数(?is)

我目前的正则表达式是::(?<Tag>[0-9]{1,}[a-z]{0,}):(?<Value>.*?)(?=:75:|:75E:|:79:)

我的示例字符串是:

:20:gtregeeg.::()(*&(*&(ERW
:70:fdaksjfdjkahfdkahkdahjkdafda+++----
- :20:aslfkjdklasjdlsafjkdsaf.\[[][^%$#%*$^#(
:75: asdfasdfsasfd812349798759*&)(*)((_
.5697.dsaasdfasfa()()(2435325&^&*&()*
:79:afdfdasfdas(*(&*(&)(__+-*-**--+
:75E:adfasf-++++***/*/-/-*/*++...
:20:dafsdfadfasd_+_+)((*&&^*
:75:sdafassfafdfadsafdadfaaf204392-395(**(&(&()*)
:::.....------------+-**--

如何匹配所有内容直到第一个标记匹配:75:,因为如果字符串文本中有更多标记,则它会继续匹配。我只需要匹配到第一个找到的标签:75:,我不关心接下来会发生什么。试图搜索这个网站的特定解决方案和什么尝试没有帮助我得到相同的答案,如果标签在文本中进一步发生它仍然匹配。谢谢你的帮助。

我已经更新了我的正则表达式,当多个正向前看因此在结尾.*$没有帮助时,它仍然会产生整个字符串,但我想要的输出应该只是第一次匹配,直到第一次遇到标签:

:20:gtregeeg.::()(*&(*&(ERW
:70:fdaksjfdjkahfdkahkdahjkdafda+++----
- :20:aslfkjdklasjdlsafjkdsaf.\[[][^%$#%*$^#(

3 个答案:

答案 0 :(得分:1)

这是一个正如你所希望的那样做的正则表达式:

:(?<Tag>[0-9]{1,}[a-z]{0,}):(?<Value>.*?)(?=:75:).*$

.*$将使用您到目前为止的所有文字,因此第一个捕获组将包含Tag到第一个:75:的文字。这适用于SinglelineIgnorecase选项。

在Expresso中测试:

enter image description here

要抓住字符串的整个开头部分直到第一个:75:,您应该添加另一个捕获begin组:(?si)(?<begin>:(?<Tag>[0-9]{1,}[a-z]{0,}):(?<Value>.*?))(?=:75:).*$

这是program showing the captured groups

using System.IO;
using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        var rgx = new Regex(@"(?si)(?<begin>:(?<Tag>[0-9]{1,}[a-z]{0,}):(?<Value>.*?))(?=:75:).*$");
        var str = @":20:gtregeeg.::()(*&(*&(ERW
:70:fdaksjfdjkahfdkahkdahjkdafda+++----
- :20:aslfkjdklasjdlsafjkdsaf.\[[][^%$#%*$^#(
:75: asdfasdfsasfd812349798759*&)(*)((_
.5697.dsaasdfasfa()()(2435325&^&*&()*
:79:afdfdasfdas(*(&*(&)(__+-*-**--+
:75E:adfasf-++++***/*/-/-*/*++...
:20:dafsdfadfasd_+_+)((*&&^*
:75:sdafassfafdfadsafdadfaaf204392-395(**(&(&()*)
:::.....------------+-**--";
        var mtch = rgx.Match(str);

        // Show our captured values and first match
        Console.WriteLine(string.Format("Value:\n{0}\n========================================\nTag:\n{1}=============================\nBeginning of string up to first `:75:`:\n{2}", mtch.Groups["Tag"].Value, mtch.Groups["Value"].Value, mtch.Groups["begin"].Value));

    }
}

答案 1 :(得分:0)

您可以这样做:YOUR_TEXT.Split(new string [] {":75:"})[0]

如果我要将它变成一个函数,我可能会做类似的事情:

public static FindFirstOccurance Tuple<bool,String> (string input, 
    string search)
{
    if(String.IsNull(input)){throw new ArgumentException("Input is null");}
    if(String.IsNull(search)){throw new ArgumentException("search is null");}


   var parts = input.Split(new string[]{search});

   return new Tuple<bool,string>(parts > 1, parts[0]);

}

答案 2 :(得分:0)

如果使用此正则表达式在regex101.com上测试您的样本数据

:(?<Tag>\d+[a-z]*):(?<Value>.*?)(?=:75:)

与您在值组末尾添加尾部冒号的提案基本相同,并且它正在工作,而不是扩展到更多文本。应该也适合你。还有其他不适合您的样本数据吗?