匹配轮次

时间:2008-12-26 01:29:24

标签: c# regex

我有一些文字具有以下结构:

Round 1

some multiline text ...

Round 2

some multiline text ...

...

Round N

some multiline text ...

我想将轮次与多行文字进行匹配。

这些表达式都不会产生正确的结果:

(圆形\ S \ d +)((?圆形)。*?)

(圆形\ S \ d +)(。*?)

有人可以帮助我吗?

提前谢谢。

6 个答案:

答案 0 :(得分:1)

默认情况下,点(.)字符与换行符之外的所有字符匹配。在许多语言中,您可以使用s修饰符使点匹配所有字符,包括换行符。看起来应该是这样的:

/(Round\s\d+)(.*?)(Round\s\d+|$)/s

(不是100%确定这个正则表达式是否有效,我只是告诉你如何使用s修饰符。)

修改:在regexpal.com上进行测试,它似乎有效。

答案 1 :(得分:1)

直接在多行上使用正则表达式可能并不容易(就可读性和可维护性而言)。

我会逐行处理文本,并使用数据结构来保存到目前为止看到的内容。当您有标题,正文等时,可以将其与电子邮件处理进行比较。

答案 2 :(得分:1)

这是一个C#问题吗?

(圆形\ S \ d +)(。*?)

使用RegexOptions.Singleline

单线指定单线模式。更改点(。)的含义,使其匹配每个字符(而不是除\ n之外的每个字符)。

你应该使用Matches而不是Match。

答案 3 :(得分:0)

使用不情愿的量词作为正则表达式中的最后一件事,很少是正确的。在这个正则表达式:

/(Round\s+\d+)(.*?)/s

... (.*?)部分的第一件事就是尝试匹配零个字符。这是完全合法的匹配,因为量词是不情愿的,它就在那里停止。如果你打算这样做,就必须在(.*?)之后有一些东西,像这样:

/(Round\s+\d+)(.*?)(Round\s+\d+)/s

这样,(.*?)不能停在零个字符;它必须保持匹配消费字符,直到它到达正则表达式的下一部分 - (Round\s+\d+) - 可以接管的位置。但是你不想使用那个正则表达式,因为它消耗了应该是下一个匹配的部分内容。坚持这种格式,您可以使用前瞻作为结束条件:

/(Round\s+\d+)(.*?)(?=Round\s+\d+|$)/s

现在它被强制匹配整个条目,但匹配位置留在下一个条目的开头,所以下一个匹配尝试将从那里开始。 (编辑:将|$添加到前瞻以匹配最后一个条目。)

编辑:我的意思是评论你的其他正则表达式:

/(Round\s+\d+)((?!Round).*?)/s

在这里,您似乎尝试使用抢先的否定预测,而不是使用正向前瞻作为结束条件。为了实现这一点,必须在允许点消耗角色之前在每个位置执行前瞻。这意味着点必须用前瞻括在括号中,在它们之外有量词:

/(Round\s+\d+)((?:(?!Round).)*)/s

你也不能在这个正则表达式中使用不情愿的量词,原因与另一个相同。

这可能是一种更好的方法,但在我提出建议之前,我需要了解有关数据和您的要求的更多信息。

(请注意,我使用类似Perl的语法,使用斜线分隔符和尾随's'修饰符用于单行模式,因为正则表达式会在没有它们的情况下混淆网站的语法高亮显示。)

答案 4 :(得分:0)

这将使用RegexOptions.SingleLine设置:

Round\s+\d+(.*?)(?=Round\s\d|$)

答案 5 :(得分:0)

Alan,正则表达式的很棒提示。我没有足够的实践与前瞻。

/(Round \ s + \ d +)(。*?)(?= Round \ s + \ d + | $)/ s完全符合我的需要。

/(Round \ s + \ d +)((?!Round)。)* / s也可以,但会使每个字母成为一个单独的捕获。

非常感谢。

为了更准确地描述我的数据,您可以在这里查看例如: http://www.rsssf.com/tablesi/ital09.html

实际上我需要将有关轮次,比赛,结果及其日期的所有信息导入我的数据库。

我还有另一个需要解决的问题:如何将已存储的团队与匹配结果中的团队相关联。例如,我的数据库中有一个团队'Inter'。但匹配结果可能看起来像

Internazionale 1-1尤文图斯或 FC Inter 1-1尤文图斯

将来我想制作正则表达式查询,例如“获取Inter的所有匹配结果”,以便不查看整个内容。

所以我的想法是与每个团队存储他们可能的名称(标签),然后通过|。

组合它们

例如/(Inter | Internazionale | FC Inter)\ s + \ d + - \ d + \ d +(\ w +)/ s

我也怀疑(\ w +)任何球队比赛。我担心我必须用|来连接所有团队名称标签并在那里使用。对于30个团队和2-3个标签,这将是一个巨大的正则表达式。

感谢您的帮助。