我有一个文本文件如下:
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+)
答案 0 :(得分:1)
(?sm)^\d+\.\d+\s*-\s*((?:.(?!^\d+\.\d+))*)
这假设您想捕获没有数字的点,例如:Hello
如果你想捕捉数字,例如1.1 - Hello
,你可以使用相同的正则表达式并显示整个匹配,而不仅仅是第1组。下面的在线演示将显示两者。
它是如何运作的?
(parentheses)
捕获您想要组1的文本。 m
中匹配,以允许锚点^
在每一行上工作。s
中匹配,以允许点在多行上占用字符串(?!
来停止吃字符,如下所示是您的数字标记的行的开头以下是完整的工作代码和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
这里是否开始新记录。