【问题标题】:Regular Expressions truncate rather than choose C#正则表达式截断而不是选择 C#
【发布时间】:2018-04-22 14:50:14
【问题描述】:

我尝试了几十个代码并使用了一些来自 regexlib 的代码,但以下代码会截断数据而不是选择正确的代码

string pattern = @"(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})";
string input = "The numbers are 340.1 1,989.50 2,8000,100.50 3.5000 15.001 15.1";
MatchCollection collection = Regex.Matches(input, pattern);
foreach (Match m in collection)
{
Console.WriteLine(m.Value);
}

结果是:

  • 1,989.50 - 这没关系
  • 000,100.50 - 这不行。它将第一个数字从 2,8000,100.50 中删除,并拿走了它
  • 3.50 - 这不行。它从 3.5000 中减去最后 2 个数字并拿下它
  • 15.00 - 这不行。它削减了最后一位,截断数据并取走了它
  • 15.1 不在列表中。没关系

我只想匹配这种类型的数字:1.00 100.00 1,000.00 100,000.00。其余的都应该忽略。目前 x.000 也被截断 谢谢!

添加 通过添加空间,我设法停止使用 3.5000 和 15.001。但是还是不能处理2,8000,100.50

(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2} )

【问题讨论】:

  • \,\d{3} 8000 有 4 位数字?!
  • 您可能希望将预期结果添加到不正确的结果中。
  • 您能否编辑您的问题并告诉我们预期的结果应该是什么?
  • 为什么不简单地尝试用double.TryParse()解析数字?
  • 你好。我只想匹配这种类型的数字:1.00 100.00 1,000.00 100,000.00。其余的都应该忽略。目前 x.000 也被截断

标签: c# regex truncate cut


【解决方案1】:

正则表达式:

(?<=^|\s)\d{1,3}(?:,\d{3})*(?:\.\d{2})(?=\s|$)

Updated Demo

【讨论】:

  • 不幸的是,这段代码匹配所有数字,我只需要输入 1,989.50
  • 我已根据对问题的新编辑更新了正则表达式
  • 它在 regex101 中效果很好,但在 C# 中它不匹配任何东西。以前我尝试过 ^ 和 $ 并且它从来没有工作过,因为它会搜索输入的第一个和最后一个单词
  • 对不起,我再次输入代码时效果很好!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2011-06-18
  • 2023-03-27
  • 2015-07-14
相关资源
最近更新 更多