正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值
Posted
技术标签:
【中文标题】正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值【英文标题】:Regular expression split string, extract string value before and numeric value between square brackets 【发布时间】:2020-01-02 08:21:54 【问题描述】:我需要解析一个看起来像“Abc[123]”的string
。需要括号之间的数值,以及括号前的string
值。
我测试的大多数示例都可以正常工作,但是在解析一些特殊情况时遇到了问题。
这段代码在“正常”情况下似乎可以正常工作,但在处理“特殊”情况时会出现一些问题:
var pattern = @"\[(.*[0-9])\]";
var query = "Abc[123]";
var numVal = Regex.Matches(query, pattern).Cast<Match>().Select(m => m.Groups[1].Value).FirstOrDefault();
var stringVal = Regex.Split(query, pattern)
.Select(x => x.Trim())
.FirstOrDefault();
应该如何调整代码以处理一些特殊情况? 例如,对于字符串“Abc[]”,解析器应正确返回“Abc”作为字符串值,并将数值指示为空(最终可能默认为 0)。 对于字符串“Abc[xy33]”,解析器应返回“Abc”作为字符串值并指示无效的数值。 对于字符串“Abc”,解析器应返回“Abc”作为字符串值并指示缺失的数值。括号前后或括号内的空格应修剪为“Abc [123]”。
【问题讨论】:
【参考方案1】:试试这个模式:^([^\[]+)\[([^\]]*)\]
模式解释:
^
- 匹配字符串的开头
([^\[]+)
- 匹配任何字符中的一个或多个[
并将其存储在第一个捕获组中
\[
- 匹配 [
字面意思
([^\]]*)
- 匹配除]
之外的任何字符的零个或多个并存储在第二个捕获组中
\]
- 匹配 ]
字面意思
这里是测试代码:
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();
输出:
【讨论】:
谢谢,代码似乎涵盖了请求的用例! 后期编辑:不包括字符串完全没有括号的情况,比如“Abc”。 @RickyTad 更新了答案。 应该如何改变模式,以便能够处理括号之间的可选附加文本?例如,这些都应该是有效的字符串:Abc[12]
、Abc[int:123]
、Abc[bool: 5]
、Abc[float : 32 ]
【参考方案2】:
我们可以尝试对输入进行正则表达式替换,以获得单线解决方案:
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
【讨论】:
【参考方案3】:很确定会有一些基于语言的技术,我不知道,但是使用正则表达式,我们将使用捕获组捕获所有内容并逐个检查事物,也许:
^([A-Za-z]+)\s*(\[?)\s*([A-Za-z]*)(\d*)\s*(\]?)\s*$
如果您想探索/简化/修改表达式,它已经 在右上角的面板上进行了解释 regex101.com。如果你愿意,你 也可以在this link看,怎么搭配 针对一些样本输入。
【讨论】:
【参考方案4】:您无需使用正则表达式即可轻松实现这一目标
string temp = "Abc[123]";
string[] arr = temp.Split('[');
string name = arr[0];
string value = arr[1].ToString().TrimEnd(']');
输出名称 = Abc
,值 = 123
【讨论】:
以上是关于正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值的主要内容,如果未能解决你的问题,请参考以下文章