【问题标题】:Multiline Regex in C# [closed]C# 中的多行正则表达式 [关闭]
【发布时间】:2020-04-15 00:43:33
【问题描述】:

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

我要匹配下面文本的每一行,这样每一行都是一个匹配

????️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
----------

每一行都有一个玩家。

每个玩家都有他的名字: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);

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

感谢您的帮助。

【问题讨论】:

  • 如果您可以与代码中指定的所有字符串共享minimal reproducible example,那就太棒了。
  • 您能否包含使用正则表达式的代码,因为我看到它捕获了所有内容,即使每行末尾没有空格。
  • Raw,表示多行:????(.+?):(\w*)=([\d.]+)(?=\s*(\w*)=*([\d.]+)|$)(只是写在这里,没有命名组,根本没有测试)。

标签: c# regex multiline


【解决方案1】:

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

\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&lt;&gt; 中,该类会将投注值强输入 Decimal。

【讨论】:

  • 是的,用 : 和空格分割也是个好主意。但是您的正则表达式不起作用,每个玩家下的赌注几乎是无限的。
  • 我想的也差不多。我试图说明如何将它作为一个单一的正则表达式来完成。对于无限制的比赛,它不起作用,因为捕获组将始终只举行一场比赛。如果你想用 Regex 来做,你需要做的是运行两次。第一次提取玩家姓名,然后第二次提取所有投注,但是您将很难将投注与玩家匹配,因此我建议改为拆分字符串。
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多