用于捕获数字和数字范围的正则表达式

时间:2009-12-10 06:28:57

标签: c# regex

我有以下字符串

Fat mass loss was 2121,323.222 greater for GPLC (2–2.4kg vs. 0.5kg)

我想抓拍

212,323.222
2-2.24
0.5

即。我想要字符串中的上述三个结果,
任何人都可以帮助我使用这个正则表达式

9 个答案:

答案 0 :(得分:1)

我注意到 2-2.4kg 中的连字符不是连字符,它是unicode 0x2013“DASH”。

所以,这是C#中的另一个正则表达式

@"[0-9]+([,.\u2013-][0-9]+)*"

测试

MatchCollection matches = Regex.Matches("Fat mass loss was 2121,323.222 greater for GPLC (2–2.4kg vs. 0.5kg)", @"[0-9]+([,.\u2013-][0-9]+)*");
foreach (Match m in matches) {
    Console.WriteLine(m.Groups[0]);
}

结果如下,我的控制台不支持打印unicode char 2013,所以它的“?”但它恰当匹配。

2121,323.222
2?2.4
0.5

答案 1 :(得分:0)

好的,直到现在我才注意到C#标签。我会留下答案,但我知道这不是你的预期,看看你是否能用它做点什么。也许标题应该提到编程语言?


不确定

Fat mass loss was (.*) greater for GPLC \((.*) vs. (.*)kg\)

在\ 1,\ 2和\ 3中查找子字符串。 如果对于Emacs,请交换所有括号并转义括号。

答案 2 :(得分:0)

这样的事情怎么样:

^.*((?:\d+,)*\d+(?:\.\d+)?).*(\d+(?:\.\d+)?(?:-\d+(?:\.\d+))?).*(\d+(?:\.\d+)).*$

我认为有点笼统。我有点担心。*贪婪。

答案 3 :(得分:0)

  

脂肪量减少2121,323.222更大   对于GPLC(2-2.4kg对0.5kg)

广义提取器:

/\D+?([\d\,\.\-]+)/g

说明:

/           # start pattern
 \D+        # 1 or more non-digits
  (         # capture group 1          
   [\d,.-]+ # character class, 1 or more of digits, comma, period, hyphen
  )         # end capture group 1
/g          # trailing regex g modifier (make regex continue after last match)
抱歉,我不知道c#是否足以完整写入,但该模式应该正好插入。

请参阅:http://www.radsoftware.com.au/articles/regexsyntaxadvanced.aspx了解一些实施示例。

答案 4 :(得分:0)

看起来您正在尝试查找字符串中的所有数字(可能在数字中使用逗号),以及所有数字范围,例如“2-2.4”。这是一个应该有效的正则表达式:

\d+(?:[,.-]\d+)*

从C#3开始,您可以像这样使用它:

var input = "Fat mass loss was 2121,323.222 greater for GPLC (2-2.4kg vs. 0.5kg)";
var pattern = @"\d+(?:[,.-]\d+)*";

var matches = Regex.Matches(input, pattern);

foreach ( var match in matches )
  Console.WriteLine(match.Value);

答案 5 :(得分:0)

我出现了类似这样的暴行:

-?\d(?:,?\d)*(?:\.(?:\d(?:,?\d)*\d|\d))?(?:[–-]-?\d(?:,?\d)*(?:\.(?:\d(?:,?\d)*\d|\d))?)?

巫婆-?\d(?:,?\d)*(?:\.(?:\d(?:,?\d)*\d|\d))?重复两次,中间有(注意这是一个长连字符)。
这应该处理数字之外的点和逗号,例如: hello,23,45.2-7world - 将捕获 23,45.2-7

答案 6 :(得分:0)

嗯,这是一个棘手的问题,特别是因为输入字符串包含unicode字符 - (EN DASH)而不是 - (HYPHEN-MINUS)。因此,匹配原始字符串中的数字的正确正则表达式为:

\d+(?:[\u2013,.]\d+)*

如果您想要更通用的方法,那就是:

\d+(?:[\p{Pd}\p{Pc}\p{Po}]\d+)*

匹配短划线标点符号连接符标点符号其他标点符号。有关这些内容的详情,请参阅here

C#中的实现如下所示:

string input = "Fat mass loss was 2121,323.222 greater for GPLC (2–2.4kg vs. 0.5kg)";
try {
    Regex rx = new Regex(@"\d+(?:[\p{Pd}\p{Pc}\p{Po}\p{C}]\d+)*", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    Match match = rx.Match(input);
    while (match.Success) {
        // matched text: match.Value
        // match start: match.Index
        // match length: match.Length
        match = match.NextMatch();
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

答案 7 :(得分:0)

我得到了解决问题的方法。

以下是给出我想要的结果的正则表达式:

(([0-9]+)([–.,-]*))+

答案 8 :(得分:0)

我们试试这个:

(?=\d)([0-9,.-]+)(?<=\d)

它捕获仅包含:

的所有表达式
  • “[0-9,.-]”字符,
  • 必须以数字“(?= \ d)”,
  • 开头
  • 必须以数字“(?&lt; = \ d)”
  • 结束

它适用于单个数字表达式,不包括开头或尾随[。, - ]。

希望这有帮助。