正则表达式解析行首

Posted

技术标签:

【中文标题】正则表达式解析行首【英文标题】:Regex Parsing Beginning of Line 【发布时间】:2014-07-25 08:25:16 【问题描述】:

我有一个字符串,我想用正则表达式解析它。 .. 表示类别名称,: 之后的所有内容都是该类别的内容。

下面是我要解析的完整字符串:

..NAME: JOHN
..BDAY: 1/1/2010
..NOTE: 1. some note 1
 2. some note 2
 3. some note 3
..DATE: 6/3/2014

我正在尝试解析它以便

(group 1) 
..NAME: JOHN

(group 2)
..BDAY: 1/1/2010

(group 3)
..NOTE: 1. some note 1
 2. some note 2
 3. some note 3

(group 4)
..DATE: 6/3/2014  //a.k.a update date

我使用的正则表达式模式是

\.\.[A-Z0-9]2,4:.*

这使得(group 3) ..NOTE: 1. some note 1 缺少第二行和第三行的内容。

如何修改我的模式以便获得正确的分组?

【问题讨论】:

【参考方案1】:

. 匹配除换行符以外的所有内容(在大多数语言中,Ruby 是一个例外)。在 C# 中使用 RegexOptions.Singleline(或在 PCRE 中使用 s modifier)。


您需要让您的.* 延迟到下一个.. 或字符串结尾$,这样您就不会第一次匹配所有内容。此外,. 在字符类中没有任何特殊含义..因此您的表达式最终可能看起来像这样更干净:

[.]2[A-Z0-9]2,4:.*?(?=[.]2|$)

演示: Regex 和 C#

【讨论】:

谢谢!但是,这仍然不能解决第 3 组仅获得第一行的问题。我的目标是获得第 3 组的所有 3 行。另外,我正在使用 C#。 @sora0419 对不起!我的意思是Singleline 不是Multiline..我不精通C#,我误读了文档。我添加了一个C# demo。 演示肯定帮了大忙!非常感谢! 请注意,这将包括尾随换行符(因为 \n. 匹配,并且出现在前瞻中的 [.]2 之前)。您可以通过在前瞻中添加空格来解决此问题:(?=\s*[.]2|$)【参考方案2】:

我设法通过对[.]2 的负面预测来实现它:

[.]2[A-Z0-9]2,4:(.*\n?(?![.]2))*

【讨论】:

以上是关于正则表达式解析行首的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式从行首修剪数据

为啥这个正则表达式只在 Python 中的行首匹配? [复制]

正则表达式

linux 中 ^[^abc] 正则表达式啥意思

正则表达式删除单行 SQL 注释 (--)

Linux命令中使用正则表达式