正则表达式不匹配特定的序列
本文关键字:不匹配 正则表达式 | 更新日期: 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。下面的在线演示将向您展示这两者。
它是如何工作的?
- 这个想法是捕获你想使用
(parentheses)
组1的文本。 - 我们在多行模式下匹配
m
,以允许锚^
在每一行上工作。 - 我们在点模式
s
中匹配,以允许点在多行上吃掉字符串 - 我们使用负向前看
(?!
来停止吃字符,当后面是你的数字标记 行的开头时
这里是完整的工作代码和一个在线演示。
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
在这里是否开始了一个新的记录