C#中的多行正则表达式

问题描述 投票:0回答:1

我不是正则表达式的大乐趣,但这次我无法避免。

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

🀄️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用空格分隔。

每个赌注都有bet_name = amount_he_won

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

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

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

感谢您的帮助。

c# regex multiline
1个回答
0
投票

就正则表达式而言,这并不优雅,但我对其进行了测试,并且可以正常工作:

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

但是,正则表达式不是解决此特定问题的最佳选择。首先,您知道每个结果都在单独的一行上,其次,您知道每个玩家的姓名和下注之间用冒号隔开,其次,您知道下注之间用空格隔开,最后是下注的名称和值用等号隔开。所以...

我会分割字符串。

Split('\n')文本以获取string[]数组,然后循环该数组。如果该行以表情符号开头,Substring()越过表情符号仅得到相关文本,则Split(':'),将为您提供一个string[]数组,其玩家名称为索引0,下注为索引1 。然后Split(' ')下注将每个赌注作为另一个string[]数组单独获得。最后,每次下注Split(' ')将获得最后一个string[]数组,其下注名称为索引0,下注值为索引1。

您可以将其包装到可以将其全部吐入自定义类的List<>的方法中,该类将把下注值强类型化为Decimal。

© www.soinside.com 2019 - 2024. All rights reserved.