正则表达式与某些序列不匹配

时间:2014-05-20 18:01:16

标签: c# .net regex

我有一个文本文件如下:

1.1 - Hello
1.2 - world!
2.1 - Some
data
here and it contains some 32 digits so i cannot use \D+
2.2 - Etc..

所以我希望正则表达式在这种情况下为每个点获得4个匹配。我的正则表达式并不像我希望的那样工作。请,建议:

private readonly Regex _reactionRegex = new Regex(@"(\d+)\.(\d+)\s*-\s*(.+)", RegexOptions.Compiled | RegexOptions.Singleline);

即使这个正则表达式也没有用处:

(\d+)\.(\d+)\s*-\s*(.+)(?<!\d+\.\d+)

2 个答案:

答案 0 :(得分:1)

亚历克斯,这个正则表达式会做到这一点:

(?sm)^\d+\.\d+\s*-\s*((?:.(?!^\d+\.\d+))*)

这假设您想捕获没有数字的点,例如:Hello

如果你想捕捉数字,例如1.1 - Hello,你可以使用相同的正则表达式并显示整个匹配,而不仅仅是第1组。下面的在线演示将显示两者。

它是如何运作的?

  1. 我们的想法是使用(parentheses)捕获您想要组1的文本。
  2. 我们在多行模式m中匹配,以允许锚点^在每一行上工作。
  3. 我们在dotall模式s中匹配,以允许点在多行上占用字符串
  4. 我们使用否定前瞻(?!来停止吃字符,如下所示是您的数字标记的行的开头
  5. 以下是完整的工作代码和online demo

    using System;
    using System.Text.RegularExpressions;
    using System.Collections.Specialized;
    class Program {
    
    static void Main() {
    string yourstring = @"1.1 - Hello
    1.2 - world!
    2.1 - Some
    data
    here and it contains some 32 digits so i cannot use \D+
    2.2 - Etc..";
    var resultList = new StringCollection();
    try {
        var yourRegex = new Regex(@"(?sm)^\d+\.\d+\s*-\s*((?:.(?!^\d+\.\d+))*)");
        Match matchResult = yourRegex.Match(yourstring);
        while (matchResult.Success) {
            resultList.Add(matchResult.Groups[1].Value);
        Console.WriteLine("Whole Match: " + matchResult.Value);
        Console.WriteLine("Group 1: " + matchResult.Groups[1].Value + "\n");
            matchResult = matchResult.NextMatch();
        } 
    } catch (ArgumentException ex) {
        // Syntax error in the regular expression
    }
    
    Console.WriteLine("\nPress Any Key to Exit.");
    Console.ReadKey();
    } // END Main
    } // END Program
    

答案 1 :(得分:0)

This may do您正在寻找什么,但预期结果有些含糊不清。

(\d+)\.(\d+)\s*-\s*(.+?)(\n)(?>\d|$)

例如,如果数据如下所示,那么模糊性就是您希望匹配的内容:

1.1 - Hello
1.2 - world!
2.1 - Some
data here and it contains some 
32 digits so i cannot use \D+
2.2 - Etc..

不清楚32这里是否开始新记录。