我有一些文字具有以下结构:
Round 1
some multiline text ...
Round 2
some multiline text ...
...
Round N
some multiline text ...
我想将轮次与多行文字进行匹配。
这些表达式都不会产生正确的结果:
(圆形\ S \ d +)((?圆形)。*?)
(圆形\ S \ d +)(。*?)
有人可以帮助我吗?
提前谢谢。
答案 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个标签,这将是一个巨大的正则表达式。
感谢您的帮助。