C# 使用正则表达式的带拖尾单元

C# 使用正则表达式的带拖尾单元,c#,regex,C#,Regex,假设原文是这样的: 12345{unit} 那么删除{unit}部分并只保留数字的正则表达式模式是什么?请注意,单元的长度可以是随机的。谢谢 编辑: 我曾考虑过使用\d+,但我想如果数字部分包含某种分隔符,例如1000分隔符,它会失败。因此,如果数字像这样,12345,那么模式\d可能不起作用 Regex.Match(input, @"([0-9]+) ") 或 将只匹配数字部分 或 将只匹配数字部分该“单元”部分到底由什么组成?里面有数字吗?如果没有,则这可能会起作用: string num

假设原文是这样的:

12345{unit}

那么删除
{unit}
部分并只保留数字的正则表达式模式是什么?请注意,
单元的长度可以是随机的。谢谢

编辑: 我曾考虑过使用\d+,但我想如果数字部分包含某种分隔符,例如1000分隔符,它会失败。因此,如果数字像这样,12345,那么模式\d可能不起作用

Regex.Match(input, @"([0-9]+) ")

将只匹配数字部分

将只匹配数字部分

该“单元”部分到底由什么组成?里面有数字吗?如果没有,则这可能会起作用:

string numberPart = Regex.Match(@"\d+").Value;
“单元”部分到底由什么组成?里面有数字吗?如果没有,则这可能会起作用:

string numberPart = Regex.Match(@"\d+").Value;

如果您总是使用这种格式,我想您不必使用RegExp。您可以在空格上拆分字符串,将空格之前的内容作为您的号码

string original = "12345 {unit}";
string[] parts = original.Split(' ');
string yourNumber = parts[0];

如果您总是使用这种格式,我想您不必使用RegExp。您可以在空格上拆分字符串,将空格之前的内容作为您的号码

string original = "12345 {unit}";
string[] parts = original.Split(' ');
string yourNumber = parts[0];

此外,一个简单的字符串操作就足够了。取起始数字序列:

string text = "12345 {unit}";
string result = new string (text.Trim().TakeWhile(c => char.IsDigit(c)).ToArray());

此外,一个简单的字符串操作就足够了。取起始数字序列:

string text = "12345 {unit}";
string result = new string (text.Trim().TakeWhile(c => char.IsDigit(c)).ToArray());

如果要捕获数字,只有当存在
{unit}
部分时,才能使用此模式:

(\d+)(?:\s+\{\w+\})

?:
意味着它不会捕获空间和单位。

如果要捕获数字,只有当存在
{unit}
部分时,才能使用此模式:

(\d+)(?:\s+\{\w+\})
string extractValue(string input) {
  var result=Regex.Match(input,@"(\d+(?:,\d{3})*)\s";
  return (result.Success) ? result.Groups[0].Value : null;
}
?:
表示它无法捕获空间和单元

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方法

如果匹配失败,此函数将返回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方法。regex
[0-9][,0-9]+[0-9]
应执行此操作。这将接受数字和逗号作为分隔符。

regex
[0-9][,0-9]+[0-9]
应执行此操作。这将接受数字和逗号作为分隔符

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]+$") + "]");
}
我的逻辑是只检测值后面的非数字。前面和中间的负号(-)、逗号、点将保持不变

此通用逻辑可用于仅剥离值或仅剥离单位

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}]
我的逻辑是只检测值后面的非数字。前面和中间的负号(-)、逗号、点将保持不变

此通用逻辑可用于仅剥离值或仅剥离单位

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}]

简单的\d+有效吗?简单的\d+有效吗?根据OP,数字和单位部分之间有一个空格…空格将被匹配,但不会成为匹配组的一部分根据OP,数字和单位部分之间有一个空格…空格将被匹配,但不会成为匹配组的一部分。问题是,这不是一个特定的函数仅处理这种情况。它还经常接收常规字符串,如普通句子。可能使用
input.Split(new[]{'''},2);
将拆分限制为两个strings@woodykiddy我明白了,是的,在这种情况下,我的答案不会给你带来好运。问题是,它不是一个只处理这种情况的特定函数。它也经常接收常规字符串,比如普通句子。可能使用
input.Split(new[]{''>,2);
将拆分限制为两个strings@woodykiddy我明白了,如果是那样的话,我的回答不会给你带来好运。