繁体   English   中英

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

[英]regex for capturing digits and digit ranges

我有以下字符串

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

我想捕捉

212,323.222
2-2.24
0.5

即我想要字符串的上述三个结果,
有人可以帮我这个正则表达式吗

我注意到您在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]);
}

这是结果,我的控制台不支持打印uni char char 2013,因此其为“?”。 但其正确匹配。

2121,323.222
2?2.4
0.5

好的,直到现在我才注意到C#标签。 我将留下答案,但我知道这不是您所期望的,请看您是否可以做些什么。 也许标题应该提到编程语言?


当然:

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

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

这样的事情怎么样:

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

我想更一般一些。 我有点担心。*贪婪。

GPLC的脂肪质量损失增加了2121,323.222(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

似乎您正在尝试查找字符串中的所有数字(数字中可能带有逗号)以及所有数字范围,例如“ 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);

我冒出了这样的暴行:

-?\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

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

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

如果您想使用更通用的方法,可以:

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

破折号连接符其他标点匹配。 有关更多信息,请参见此处

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
}

我已经解决了我的问题。

以下是产生我想要的结果的正则表达式:

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

让我们试试这个:

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

它捕获仅包含的所有表达式:

  • “ [0-9,.-]”字符,
  • 必须以数字“(?= \\ d)”开头,
  • 必须以数字“(?<= \\ d)”结尾

它与单个数字表达式一起使用,并且不包括开头或结尾的[。,-]。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM