破折号分隔字符串中负值和正值的正则表达式

Posted

技术标签:

【中文标题】破折号分隔字符串中负值和正值的正则表达式【英文标题】: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:我问你确切的预期输出,但你说它运行良好,我删除了评论。如果您需要更多帮助,请随时在我的回答下方发表评论。 【参考方案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 确认它有效(接受答案后评论被删除)。要匹配任何“破折号”,可以将模式中的- 替换为\pPd 是的,我假设破折号分隔符是与减号相同的字符,而不是其他破折号之一。 是的,对不起,这是我的错……这就是传入数据现在的样子-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"]吗?

以上是关于破折号分隔字符串中负值和正值的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

破折号是R正则表达式中的特殊字符吗?

如何编写正则表达式以仅匹配数字、字母和破折号?

带有 0 或 1 的正则表达式数字 - 后跟数字

正则表达式用破折号、空格破折号、点空间、点和带有空字符串的撇号替换空格

IBAN 正则表达式包括空格和破折号

如果仅重复一组符号,如何使正则表达式匹配?