【问题标题】:Regex for both negative and positive values in dash-separated string破折号分隔字符串中负值和正值的正则表达式
【发布时间】:2017-08-29 15:19:35
【问题描述】:

我正在从串口读取重量和尺寸破折号分隔值。

这是传入数据现在的样子:

-15.0cm-47.8cm-83.1cm:  0.115 kg

这是我的模式

@"(\d+\.\d+)"

但是,有时这些值之一也可能是负数,例如

--15.0cm-47.8cm--83.1cm: 0.115 kg.

我的问题是如何同时获得负值和正值?我对上述字符串的预期输出是[ "-15.0", "47.8", "-83.1", "0.115"]

【问题讨论】:

  • 等等这个例子有负值,还是用破折号分隔值?
  • 示例是破折号分隔
  • 所以如果你得到负值,它看起来像--6.24cm--5.5cm--10cm: -25.0 kg?
  • 是的,我知道,感谢您的警告,但我还没有得到负值。这只是预防。
  • @TheNewBegining:我问你确切的预期输出,但你说它运行良好,我删除了评论。如果您需要更多帮助,请随时在我的回答下方发表评论。

标签: c# regex match


【解决方案1】:

您可以使用后向模式来确保在另一个之前有一个“破折号”(将被消耗,即添加到匹配值中):

(?:(?<=-)-)?\d+\.\d+

查看regex demo--15.0cm-47.8cm--83.1cm: 0.115 kg 字符串:

这里,(?:(?&lt;=-)-)? 是一个可选的非捕获组,它匹配前面有另一个 --\d+\.\d+ 匹配 1+ 位、. 和 1 位或更多位。

C#代码:

var results = Regex.Matches(str, @"(?:(?<=-)-)?\d+\.\d+")
          .Cast<Match>()
          .Select(m => m.Value)
          .ToList();

【讨论】:

  • 这行不通,因为数据显然是用破折号分隔的(它总是会选择负数)。
  • 人们将- 称为减号、破折号、连字符...是的。并且 OP 确认它有效(接受答案后评论被删除)。要匹配任何“破折号”,可以将模式中的- 替换为\p{Pd}
  • 是的,我假设破折号分隔符是与减号相同的字符,而不是其他破折号之一。
  • 是的,对不起,这是我的错……这就是传入数据现在的样子-15.0cm-47.8cm-83.1cm: 0.115 kg,它是用破折号分隔的。但有时其中一个值可能是负数,例如--15.0cm-47.8cm--83.1cm: 0.115 kg。我的问题是,如果我需要多个模式来同时获得负值和正值。很抱歉造成了误解。
  • 那么,你需要从--15.0cm-47.8cm--83.1cm: 0.115 kg得到[ "-15.0", "47.8", "-83.1", "0.115"]吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多