如何使用正则表达式获取特定值

本文关键字:获取 何使用 正则表达式 | 更新日期: 2023-09-27 18:29:17

我只需要获得像这样括号中的数字,具有以下字符串:

itsonlyaexample[0:4:2]test

我只需要提取042

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中获取括号内的数字。

演示