正则表达式不匹配特定的序列

本文关键字:不匹配 正则表达式 | 更新日期: 2023-09-27 18:04:12

我有一个如下的文本文件:

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+)

正则表达式不匹配特定的序列

Alex,这个正则表达式可以做到:

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

这是假设您想要捕获点,而不需要数字,例如:仅Hello

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

它是如何工作的?

  1. 这个想法是捕获你想使用(parentheses)组1的文本。
  2. 我们在多行模式下匹配m,以允许锚^在每一行上工作。
  3. 我们在点模式s中匹配,以允许点在多行上吃掉字符串
  4. 我们使用负向前看(?!来停止吃字符,当后面是你的数字标记
  5. 行的开头时

这里是完整的工作代码和一个在线演示。

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

这可能满足您的要求,尽管预期结果存在一些歧义。

('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在这里是否开始了一个新的记录