我不是正则表达式的大乐趣,但这次我无法避免。
我必须匹配以下文本的每一行,以便每一行都是匹配项
🀄️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);
正则表达式仅匹配一个匹配项,但是如果我在每行的末尾添加一个空格,则说明一切正常。我不明白为什么。
感谢您的帮助。
就正则表达式而言,这并不优雅,但我对其进行了测试,并且可以正常工作:
\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。