首页 > 解决方案 > C# 中的多行正则表达式

问题描述

我不是很喜欢正则表达式,但这次我无法避免它们。

我必须匹配以下文本的每一行,以便每一行都是匹配的

️Winners in this draw️
John VN:Odd5=9.9 Pair3=6
iiiddd:Odd1=1.98
aaaxxx:Dragon10=21 Odd20=39.6
GeralynAguilar:Big4=7.92
----------

每条线上都有一名球员。

Foreach Player 有他的名字:all_the_bets_he_placed,以空格分隔。

Foreach 投注有 bet_name=amount_he_won

我需要上述所有字段并编写了可能很丑的正则表达式

    Regex r = new Regex(@"^(?<player>(?<name>[^:]+):(?<allbets>(?<onebet>(?<betname>[^=\s]*)=(?<value>\d+\.?\d*)\s?))+)$", RegexOptions.ExplicitCapture| RegexOptions.Multiline);

正则表达式只匹配一个匹配项,但如果我在每一行的末尾添加一个空格,一切都会正常工作。我不明白为什么。

谢谢你的帮助。

标签: c#regexmultiline

解决方案


这在正则表达式方面并不优雅,但我对其进行了测试并且它有效:

\uD83D\uDC49(?<player>[^:]+):(?<bet1name>[^:=]+)=(?<bet1value>\d+(?:\.\d+)?)(?:\s(?<bet2name>[^:=]+)=(?<bet2value>\d+(?:\.\d+)?))?

但是,Regex 并不是解决这个特定问题的最佳选择。首先,您知道每个结果在单独的一行,其次,您知道每个玩家的姓名和他们的赌注用冒号分隔,接下来,您知道赌注用空格分隔,最后,赌注的名称和价值用等号分隔。所以...

我会拆分字符串。

Split('\n')文本获取一个string[]数组,然后循环该数组。如果该行以表情符号开头,Substring()然后通过表情符号以获取相关文本,那么Split(':'),这将为您提供一个string[]数组,其中玩家姓名位于索引 0,投注位于索引 1。然后Split(' ')是单独获得每个投注的投注作为另一个string[]数组。最后,Split(' ')每次下注得到最后一个string[]数组,下注名称在索引 0 处,下注值在索引 1 处。

您可以将其包装到一个方法中,该方法可以将其全部吐出到List<>一个自定义类中,该类将强类型下注值转换为小数。


推荐阅读