使用正则表达式剥离尾随单位
本文关键字:单位 剥离 正则表达式 | 更新日期: 2023-09-27 18:20:16
假设原始文本是这样的:
12345 {unit}
那么,删除{unit}
部分并只保留数字的正则表达式模式是什么?注意,unit
的长度可以是随机的。谢谢
编辑:好吧,我曾想过使用''d+,但我想如果数字部分包含某种分隔符,例如1000分隔符,它会失败。因此,如果数字看起来是这样的,12345,那么模式''d可能不起作用。
string extractValue(string input) {
var result=Regex.Match(input,@"('d+(?:,'d{3})*)'s";
return (result.Success) ? result.Groups[0].Value : null;
}
此函数将在匹配失败时返回null,否则将返回匹配的值字符串。
然后,您也可以通过int.parse解析结果以获得int
int? extractIntValue(string input) {
var result=Regex.Match(input,@"('d+(?:,'d{3})*)'s";
if (result.Success) return int.Parse(result.Groups[0].Value,System.Globalization.NumberStyles.AllowThousands|System.Globalization.NumberStyles.Integer);
return null;
}
如果结果可以是十进制(而不是整数),则匹配线将读取
var result=Regex.Match(input,@"('d+(?:,'d{3})*(?:'.'d+))'s";
如果您使用的是十进制值,那么您将使用适当的decimal.parse方法
如果您总是使用这种格式,我想您不必使用RegExp。你可以在空格上拆分字符串,将空格前的内容作为你的数字。
string original = "12345 {unit}";
string[] parts = original.Split(' ');
string yourNumber = parts[0];
string[] sa =
{ "12345 {unit}", "12345{unit}", "-123.45{unit}","-1,023.45{unit}",
"12345 cm", "99%", "99.1 %", "0.1234{unit}","-0.1234{unit}",
"12345", "123.45", "12,345.67 {unit}"
};
foreach (string s in sa) {
Console.WriteLine("Numeric=[" + Regex.Replace(s, @"[^'d]+$", "") + "], Unit=[" + Regex.Match(s, @"[^'d]+$") + "]");
}
我的逻辑是只检测值后面的none数字。前面和中间的负号(-)、逗号、句点将保持不变。
此通用逻辑可用于仅剥离值或仅剥离单位。
Numeric=[12345], Unit=[ {unit}]
Numeric=[12345], Unit=[{unit}]
Numeric=[-123.45], Unit=[{unit}]
Numeric=[-1,023.45], Unit=[{unit}]
Numeric=[12345], Unit=[ cm]
Numeric=[99], Unit=[%]
Numeric=[99.1], Unit=[ %]
Numeric=[0.1234], Unit=[{unit}]
Numeric=[-0.1234], Unit=[{unit}]
Numeric=[12345], Unit=[]
Numeric=[123.45], Unit=[]
Numeric=[12,345.67], Unit=[ {unit}]
Regex.Match(input, @"([0-9]+) ")
或
Regex.Match(input, @"('d+) ")
将只匹配数字部分
此外,简单的字符串操作就足够了。取起始数字序列:
string text = "12345 {unit}";
string result = new string (text.Trim().TakeWhile(c => char.IsDigit(c)).ToArray());
"单元"部分究竟由什么组成?里面能有数字吗?如果没有,那么这可能会起作用:
string numberPart = Regex.Match(@"'d+").Value;
如果你想获取数字,只有当有{unit}
部分时,你才能使用这个模式:
('d+)(?:'s+'{'w+'})
?:
意味着它不会捕获空间和单元。
正则表达式[0-9][,0-9]+[0-9]
应该可以做到这一点。这将接受数字和逗号作为分隔符。