Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式拆分字符串,提取前面的字符串值和方括号之间的数值_C#_Regex_Split - Fatal编程技术网

C# 正则表达式拆分字符串,提取前面的字符串值和方括号之间的数值

C# 正则表达式拆分字符串,提取前面的字符串值和方括号之间的数值,c#,regex,split,C#,Regex,Split,我需要解析一个类似“Abc[123]”的字符串。需要括号之间的数值,以及括号前的字符串值 我测试的大多数示例都很好,但在解析某些特殊情况时存在问题 此代码似乎适用于“正常”情况,但在处理“特殊”情况时存在一些问题: var模式=@“\[(.[0-9])\]”; var query=“Abc[123]”; var numVal=Regex.Matches(query,pattern).Cast().Select(m=>m.Groups[1].Value).FirstOrDefault(); var

我需要解析一个类似“Abc[123]”的
字符串。需要括号之间的数值,以及括号前的
字符串

我测试的大多数示例都很好,但在解析某些特殊情况时存在问题

此代码似乎适用于“正常”情况,但在处理“特殊”情况时存在一些问题:

var模式=@“\[(.[0-9])\]”;
var query=“Abc[123]”;
var numVal=Regex.Matches(query,pattern).Cast().Select(m=>m.Groups[1].Value).FirstOrDefault();
var stringVal=Regex.Split(查询,模式)
.Select(x=>x.Trim())
.FirstOrDefault();
如何调整代码以处理一些特殊情况? 例如,对于字符串“Abc[]”,解析器应该正确地返回“Abc”作为字符串值,并指示数字值的空值(最终可能默认为0)。 对于字符串“Abc[xy33]”,解析器应返回“Abc”作为字符串值,并指示无效的数值。
对于字符串“Abc”,解析器应返回“Abc”作为字符串值,并指示缺少的数值。括号前/后或括号内的空格应修剪为“Abc[123]”

我们可以尝试对输入进行正则表达式替换,以获得一行程序解决方案:

string input = "Abc[123]";
string letters = Regex.Replace(input, "\\[.*\\]", "");
string numbers = Regex.Replace("Abc[123]", ".*\\[(\\d+)\\]", "$1");
Console.WriteLine(letters);
Console.WriteLine(numbers);
这张照片是:

Abc
123

很确定会有一些基于语言的技术,我不知道,但是通过正则表达式,我们可以使用捕获组捕获所有内容并逐个检查,也许:

^([A-Za-z]+)\s*(\[?)\s*([A-Za-z]*)(\d*)\s*(\]?)\s*$

如果您希望探索/简化/修改该表达式,它已被删除 在的右上面板上进行了说明 . 如果你愿意,你可以 也可以观看,它将如何匹配 对照一些样本输入


试试这个模式:
^([^\[]+)\[([^\]]*])\]

模式说明:

^
-匹配字符串的开头

([^\[]+)
-匹配一个或多个接收的任何字符
[
,并将其存储在Inde first capturing group中

\[
-按字面意思匹配
[

([^\]]*)
-匹配除
]
之外的任何字符的零个或多个,并存储在第二个捕获组中

\]
-按字面意思匹配
]

下面是经过测试的代码:

  var pattern = @"^([^\[]+)\[([^\]]*)\]";
  var queries = new string[]{ "Abc[123]", "Abc[xy33]", "Abc[]", "Abc[ 33 ]", "Abc" };
  foreach (var query in queries)
  {
    string beforeBrackets;
    string insideBrackets;
    var match = Regex.Match(query, pattern);
    if (match.Success)
    {
      beforeBrackets = match.Groups[1].Value;
      insideBrackets = match.Groups[2].Value.Trim();
      if (insideBrackets == "")
        insideBrackets = "0";
      else if (!int.TryParse(insideBrackets, out int i))
        insideBrackets = "incorrect value!";
    }
    else
    {
      beforeBrackets = query;
      insideBrackets = "no value";
    }
    Console.WriteLine($"Input string {query} : before brackets: {beforeBrackets}, inside brackets: {insideBrackets}");
  }

  Console.ReadKey();
输出:


无需使用正则表达式,即可轻松实现这一目标

string temp = "Abc[123]";
string[] arr =  temp.Split('[');
string name = arr[0];
string value = arr[1].ToString().TrimEnd(']');

输出名称=
Abc
,值=
123

谢谢,代码似乎涵盖了请求的用例!稍后编辑:它不包括字符串完全没有括号的情况,如“Abc”。@RickyTad更新了答案。应该如何更改模式,以便能够处理括号之间的可选附加文本?例如,这些字符串都应该是有效字符串:
Abc[12]
Abc[int:123]
Abc[bool:5]
Abc[float:32]
string temp = "Abc[123]";
string[] arr =  temp.Split('[');
string name = arr[0];
string value = arr[1].ToString().TrimEnd(']');