【问题标题】:Regex for decimal value and optional string十进制值和可选字符串的正则表达式
【发布时间】:2017-04-27 09:14:26
【问题描述】:

我正在寻找一个正则表达式来验证评级 (1-10) + 可选文本。 评分是一个小数,有 1 分,可以使用点或逗号分隔符。 后跟一个可选的空格 + 字符串。

有效

  • 7
  • 7,5
  • 7.5
  • 7,5 这是我的字符串
  • 7.5 你好

无效

  • 7,75
  • 11
  • 7这是我的字符串
  • 7.这是我的字符串
  • 10.5 字符串

我有这个用于获取十进制值,但我不确定如何获取它后面的可选文本。

^(10|\d)([\.\,]\d{1,1})?$

【问题讨论】:

  • 也许^(?:10|\d)(?:[.,]\d)?(?:\s+.*)?$ 会按预期工作。但是这里,数字后面需要一个空格。
  • 如果空格可能丢失并且您可能输入了7This is my string 之类的输入,请尝试^(?:10|\d)(?:[.,]\d)?(?:[^\d,.].*)?$。但是,7.This is my string 将不会得到验证。
  • 是否允许使用 0.510.3?你说你想匹配1-10,但你的正则表达式匹配00.510.3
  • @MrMysteryGuest C#
  • 或者^(?:10|[1-9])(?:[.,]\d)?(?:\s+.*)?$ 对你有用吗?对不起,我迷失了你的要求。数字后面的空格是可选的吗?你写了后跟一个可选空格+字符串,但后来你说7This is my string无效。

标签: c# regex


【解决方案1】:

从您的示例来看,初始数字后的空格不是可选的。因此,您可以使用的模式是

^(?:10|[1-9](?:[.,][0-9])?)(?:\s.*)?$

或 - 因为与 Regex.IsMatch 的部分匹配足以验证字符串 - 将 (?:\s.*)?$ 替换为负前瞻 (?!\S),这将需要在数字后使用空格或字符串结尾:

^(?:10|[1-9](?:[.,][0-9])?)(?!\S)
                           ^^^^^^^

regex demo

详情

  • ^ - 字符串的开头
  • (?:10|[1-9](?:[.,][0-9])?) - 10 或从 19 的数字后跟可选的 ,. 序列和任何单个数字,然后...
  • (?:\s.*)?$ - 任何空格的可选序列,后跟任何字符,直到字符串结尾 - 或 -
  • (?!\S) - 如果当前位置右侧没有非空白字符,则否定前瞻将导致匹配失败。

C# test:

var strs = new List<string> { "7","7,5","7.5","7,5 This is my string","7.5 Hello","7,75","11","7This is my string","7.This is my string","10.5 string"};
var pattern = @"^(?:10|[1-9](?:[.,][0-9])?)(?:\s.*)?$";
foreach (var s in strs)
    if (Regex.IsMatch(s, pattern))
        Console.WriteLine("{0} is correct.", s);
    else
        Console.WriteLine("{0} is invalid.", s);

输出:

7 is correct.
7,5 is correct.
7.5 is correct.
7,5 This is my string is correct.
7.5 Hello is correct.
7,75 is invalid.
11 is invalid.
7This is my string is invalid.
7.This is my string is invalid.
10.5 string is invalid.

【讨论】:

  • 如果正则表达式的行为仍然不符合预期,请在此处发表评论。
  • 谢谢!效果很好
  • 我觉得最后一部分(?:\s.*)?$也可以写成(?:\s|$)
  • @silel:甚至(?!\S)。是的。
  • @WiktorStribiżew 不错,我想知道性能方面的含义是什么......我想它主要取决于正则表达式引擎。
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2012-12-06
  • 1970-01-01
  • 2018-11-01
相关资源
最近更新 更多