正则表达式 - 通过换行查找模式

时间:2013-02-11 20:30:54

标签: c# regex

仍在学习正则表达式,并且无法让我的脑袋围绕前瞻概念。与我的问题类似的数据 - Matching multiple lines up until a sepertor line?,说我有以下几行由用户递交给我:

 0000AA.The horizontal coordinates are valid at the epoch date displayed above.
 0000AA.The epoch date for horizontal control is a decimal equivalence
 0000AA.of Year/Month/Day.
 0000AA
 [..]

所以一个非常简单的正则表达式是@^[0-9]{4}[A-Z]{2}\.(?<noteline>.*),它会给我每一行。太棒了。 :)但是,我想看看下一行的前瞻(或条件?)并告诉我该行是否有代码没有'。'。 (即如果NEXT行匹配@^[0-9]{4}[A-Z]{2}[^\.]

尝试前瞻,我得到前两行的命中(因为下面的代码后面有'。'但不是最后一行)。

编辑:使用上面的正则表达式,或下面提供的正则表达式给了我所有的行,但我想知道IF是一个空行(带有AA0000代码的行,但之后没有'。' )随后。例如,当我到达of Year/Month/Day行的匹配时,我想知道 IF 该行后跟一个空行(或不是)。 (对于高级示例,与分组名称不是空格或空格一样。)

编辑2 :我可能误用了“前瞻”一词。回到.NET的正则表达式,我看到一些被称为交替构造的东西,但不确定是否可以在这里使用它。

谢谢!
麦克

2 个答案:

答案 0 :(得分:0)

应用选项RegexOptions.Multiline。它改变了^$的含义,使它们匹配整个行的开头和结尾,而不是整个字符串的开头和结尾。

var matches = Regex.Matches(input, 
                            @"^[0-9]{4}[A-Z]{2}\..*$?(?!^[0-9]{4}[A-Z]{2}[^.])",
                            RegexOptions.Multiline);

未来的负面看法是

find(?!suffix)

匹配不在后缀之前的位置。不要逃避括号[ ]内的点。括号无论如何都会禁用大多数字符的特殊含义。

我还添加了.*$?使模式匹配,直到当前行结束。为了使? 懒惰,需要*。否则它是 greedy ,这意味着它将尝试获得尽可能多的字符,并且可能一次匹配多行。


如果您只需要数字部分,则可以将其封闭在括号内,从而将其捕获到一个组中。

(^[0-9]{4}[A-Z]{2})\..*$?(?!^[0-9]{4}[A-Z]{2}[^.])

然后你就可以得到像这样的小组

string number = match.Groups[1].Value;

注意:组#0代表整场比赛。

答案 1 :(得分:0)

经过大量的研究,打击和未命中之后,我现在肯定它无法完成 - 或者说 - 它可能但是会非常困难 - 在代码中更容易实现。

要克制,我正在查看多行字符串(文档),其中每个行前面都有一个6位数的代码。有些线 - 我感兴趣的线 - 有'。'在6位数代码之后,然后打开文本。我希望有一种方法可以让我在一个组中的每一行,以及一个标志让我知道下一行是否没有自由文本输入。 (在6位数代码之后没有'。'。)两行数据输入会给我两个匹配的文档。第一次匹配将在组中的行文本称为“notetext”,组“lastline”将为空。第二行将在'notetext'中输入注释的第二部分,而'lastline'组将具有某些内容(任何内容都无关紧要。)

根据我的理解,前瞻是零宽度断言,因此如果匹配,则可返回值仍为空。如果不使用前瞻,'lastline'的匹配将消耗下一行的代码,使'notetext'跳过该行(给我每个其他行的文本。)所以,我需要一些返回引用以恢复为。

此时,简单地获取所有行并添加文本直到我到达他们的笔记结尾更容易(代码方式)。 (循环整个文档,不能超过200行,而不是循环使用正则表达式匹配的行,并且读取代码以便将来修改的容易程度会超过正则表达式可能带给我的任何轻微的速度优势

谢谢你们 - -Mike。