0

仍在学习正则表达式,并且无法让我的头脑围绕前瞻概念。与我的问题类似的数据 -匹配多行直到分隔线?,假设我有以下几行由用户交给我:

 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>.*), where 会给我每一行。极好的。:) 但是,我想要一个前瞻(或条件?),它会查看下一行并告诉我该行是否包含没有“。”的代码。(即如果 NEXT 行匹配@^[0-9]{4}[A-Z]{2}[^\.]

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

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

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

谢谢!
麦克风。

4

2 回答 2

0

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

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

负面展望是

find(?!suffix)

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

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


如果您只需要数字部分,则可以通过将其括在括号中来将其捕获在一个组中。

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

然后你可以得到这样的组

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

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

于 2013-02-11T20:42:08.453 回答
0

在做了很多研究,碰巧失败之后,我现在确定它不能完成 - 或者更确切地说 - 它可以但会非常困难 - 更容易在代码中完成。

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

据我了解,前瞻是零宽度断言,因此如果匹配,可返回值仍然为空。如果不使用前瞻,“lastline”的匹配将消耗下一行的代码,使“notetext”跳过该行(给我每隔一行文本。)所以,我需要一些反向引用才能恢复到.

到这个时候,简单地获取所有行并添加文本直到我到达他们笔记的末尾会更容易(代码方面)。(然后循环整个文档,它不能超过 200 行,而不是循环通过正则表达式匹配的行,并且易于阅读代码以进行未来修改将超过正则表达式可以让我获得的任何轻微的速度优势.

谢谢你们——迈克。

于 2013-02-15T18:31:46.287 回答