C# 正则表达式拆分字符串,提取前面的字符串值和方括号之间的数值
我需要解析一个类似“Abc[123]”的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
字符串。需要括号之间的数值,以及括号前的字符串
值
我测试的大多数示例都很好,但在解析某些特殊情况时存在问题
此代码似乎适用于“正常”情况,但在处理“特殊”情况时存在一些问题:
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(']');