[英]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)
它捕获仅包含的所有表达式:
它与单个数字表达式一起使用,并且不包括开头或结尾的[。,-]。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.