如何使用正则表达式获取特定值
本文关键字:获取 何使用 正则表达式 | 更新日期: 2023-09-27 18:29:17
我只需要获得像这样括号中的数字,具有以下字符串:
itsonlyaexample[0:4:2]test
我只需要提取0
、4
、2
或
itsonlyaexample[0]test
我只需要提取0
如何使用C#
?
我试过了,但没有只得到括号里的数字:
('[[0-9]{1}']|'[[0-9]{1}:[0-9]{1}'])
var str = "itsonlyaexample[0:4:2]test";
var result = str
.Split('[')[1]
.Split(']')[0]
.Split(':')
.ToList();
或
var takeBrackets = str
.SkipWhile(x => x != '[')
.Skip(1)
.TakeWhile(x => x != ']');
var result = string.Concat(takeBrackets).Split(':');
您可以在全球研究中使用这种模式:
@"(?:'G(?!'A):|'[)([0-9]+)(?=:|(]))"
演示
该模式使用与上一个匹配结果之后的位置匹配的'G
锚点。因此,使用这个锚点,您可以在字符串中找到连续的元素。
在末尾有一个捕获组的展望只是为了检查是否达到了最后的方括号。(如果第二个捕获组包含]
,那就好了)。
这种方法的主要兴趣在于它可以处理数量不确定的项目。最后展望的另一个优点是,您可以通过测试第二个捕获组的存在来检查格式。
注意:如果你在大量数据中寻找这些数字,你可以尝试使用第一个字符识别技术来改进你的模式,方法是在的开头添加一个前瞻,跳过所有字符,直到开始的方括号(或分号):
@"(?=['[:])(?:'G(?!'A):|'[)([0-9]+)(?=:|(]))"
这将避免在可能的开始方括号之前为每个字符测试交替的两个分支。
图案详细信息:
(?: # the two possible entry points:
'G(?!'A): # after a previous match, so followed by a semicolon
| # OR
'[ # an opening square bracket
)
([0-9]+) # capture the number
(?= # lookahead to test if you have reached the end
:
|
(])
)
这种方式可以用于几种语言,如.net、perl、java、php、ruby。。。
.net的另一种方法
但是您可以使用.net特殊性来存储重复捕获组的不同结果:
string input = @"itsonlyaexample[0:4:2]test";
string pattern = @"'[(?:([0-9]+):?)+]";
Match match = Regex.Match(input, pattern);
if (match.Success) {
foreach (Capture capture in match.Groups[1].Captures) {
Console.WriteLine(capture.Value);
}
}
如果输入包含平衡括号,则可以使用正向前瞻断言来匹配括号内的所有数字。
@"'b'd'b(?=[^'[']]*'])"
或
@"'b'd+'b(?=[^'[']]*'])"
上面的正则表达式只有在后面跟有任何字符(而不是[
或]
的零次或更多次)并且后面必须有一个闭合的]
括号时才匹配该数字。(?=[^'[']]*'])
是一个正向前瞻断言,它不会消耗任何字符,但它决定了匹配发生的位置。
演示
代码:
String input = "itsonlyaexample[0:4:2]test'nitsonlyaexample[0]test";
Regex rgx = new Regex(@"'b'd'b(?=[^'[']]*'])");
foreach (Match m in rgx.Matches(input))
{
Console.WriteLine(m.Groups[0].Value);
}
IDEONE
解释:
'b the boundary between a word char ('w) and
something that is not a word char
'd digits (0-9)
'b the boundary between a word char ('w) and
something that is not a word char
(?= look ahead to see if there is:
[^'[']]* any character except: ''[', '']' (0 or
more times)
'] ']'
) end of look-ahead
更新:
(?:'[|(?<!^)'G)'D*('d+)'b(?=[^'[']]*'])
从组索引1中获取括号内的数字。
演示