首页 文章

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

提问于
浏览
1

嗨这个网站的正则表达式大师,我有一个问题试图写正则表达式,返回第一部分的消息,直到第一场比赛 . 我用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: 并且我不关心接下来会发生什么 . 试图搜索这个网站的特定解决方案和尝试什么没有帮助我得到相同的答案,如果标签在文本中进一步发生它仍然匹配 . 感谢帮助 .

I have update my regex, when multiple positive look ahead so at the end .*$ doesn't help, it still produces whole string, but my desired output should be only first match, till first met on of tags:

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

3 回答

  • 0

    这是一个正则表达式,它将按照您的预期方式执行:

    :(?<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));
    
        }
    }
    
  • 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]);
    
    }
    
  • 1

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

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

    这与您在值组结尾处使用附加尾部冒号的提案基本相同,并且它正在工作,而不是扩展到更多文本 . 应该也适合你 . 任何其他不适合您的样本数据?

相关问题