Regex-通过换行查找模式
本文关键字:查找 模式 换行 Regex- | 更新日期: 2023-09-27 17:58:39
仍在学习Regex,我很难理解前瞻性概念。与我在这里的问题类似的数据-匹配多条线直到一条单独的线,假设用户将以下行交给我:
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
[..]
所以一个非常简单的Regex是@^[0-9]{4}[A-Z]{2}'.(?<noteline>.*)
,它会给我每一行。太棒了。:)然而,我想要一个前瞻性(或条件?),它会查看下一行,并告诉我该行是否有不带"."的代码。(即,如果NEXT行与@^[0-9]{4}[A-Z]{2}[^'.]
匹配
试着向前看,我在前两行中得到了命中(因为下一行代码后面有"."),但在最后一行没有。
编辑:使用上面的regex或下面提供的regex可以给出所有行,但我想知道后面是否有空行(后面有AA0000代码,但没有'.')。例如,当我在of Year/Month/Day
行找到匹配项时,我想知道IF该行后面是否跟有空行。(例如,使用一个不是空格或空的分组名称。)
编辑2:我可能错误地使用了"前瞻性"术语。回顾.NET的regex,我看到了一些被称为Alternation Construct的东西,但不确定它是否可以在这里使用。
谢谢
迈克。
应用选项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组代表整个比赛。
在做了大量的研究和偶然发现之后,我现在确信这是不可能做到的——或者更确切地说,这可能会非常困难——在代码中更容易做到。
为了避免重复,我查看了一个多行字符串(文档),其中每行前面都有一个6位数的代码。有些台词——我感兴趣的台词——有一个"。"之后输入6位代码,然后打开文本。我希望有一种方法可以让我在一组中的每一行,并附上一个标志,让我知道下一行是否没有免费文本输入。(6位代码后面没有"."。)也就是说,两行数据输入会使我在文档上有两个匹配项。第一个匹配将使行的文本在名为"notetext"的组中,而组"lastline"将为空。第二行将在"notetext"中包含输入注释的第二部分,而组"lastline"将包含一些内容(任何内容都无关紧要)
据我所知,lookahead是零宽度断言,因此如果匹配,则可返回值仍然为空。如果不使用前瞻,"lastline"的匹配将消耗下一行的代码,使"notetext"跳过该行(给我其他行的文本。)因此,我需要一些反向引用才能恢复到。
到这个时候,简单地获取所有的行,并将文本相加,直到我到达他们笔记的末尾,这将更容易(从代码角度来看)。(在整个文档上循环,不能超过200行,而不是在正则表达式匹配的行中循环,而且阅读代码以备将来修改的方便性将超过正则表达式所能带来的任何微小的速度优势。
谢谢大家--迈克。