.NET REGEX仅获取整数,排除整个DECIMAL

时间:2016-09-29 05:19:30

标签: .net regex

我有一个示例字符串'((1/1000)*2375.50)'

我想获得1和1000这是一个INT

我尝试了这个REGEX表达式:

  • -?\d+(\.\d+)? =>这匹配1, 1000, and 2375.50
  • -?\d+(?!(\.|\d+)) =>这匹配1, 1000, and 50
  • -?\d+(?!\.\d+&(?![.]+[0-9]))? => 1, 1000, 2375, and 50

我必须使用什么表达来匹配(1 and 1000)?

3 个答案:

答案 0 :(得分:4)

所以基本上你需要匹配小数点前面或后面跟着小数点或其他数字的数字序列?为什么不试试呢?

[TestCase("'((1/1000)*2375.50)'", new string[] { "1", "1000" })]
[TestCase("1", new string[] { "1" })]
[TestCase("1 2", new string[] { "1", "2" })]
[TestCase("123 345", new string[] { "123", "345" })]
[TestCase("123 3.5 345", new string[] { "123", "345" })]
[TestCase("123 3. 345", new string[] { "123", "345" })]
[TestCase("123 .5 345", new string[] { "123", "345" })]
[TestCase(".5-1", new string[] { "-1" })]
[TestCase("0.5-1", new string[] { "-1" })]
[TestCase("3.-1", new string[] { "-1" })]
public void Regex(string input, string[] expected)
{
    Regex regex = new Regex(@"(?:(?<![.\d])|-)\d+(?![.\d])");
    Assert.That(regex.Matches(input)
            .Cast<Match>()
            .Select(m => m.ToString())
            .ToArray(),
        Is.EqualTo(expected));
}

似乎工作。

答案 1 :(得分:3)

您可以使用:

(?<!\.)-?\b\d+\b(?!\.)

Working example

  • (?<!\.) - 号码前没有句号。
  • -? - 可选减号
  • \b\d+\b - 号码。包含在单词边界中,因此无法与其他数字匹配(例如,与1234中的12345.6不匹配)。这与2中的2pi不符。
  • (?!\.) - 号码后没有句号。

答案 2 :(得分:1)

Try this:

    string pattern = @"\(\(([\d]+)\/([\d]+)\)\*";
    string input = @"'((1/1000)*2375.50)'";


  foreach (Match match in Regex.Matches(input, pattern))
  {
     Console.WriteLine("{0}", match.Groups[1].Value);
     Console.WriteLine("{0}", match.Groups[2].Value);

  }