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

时间:2014-11-05 12:35:50

标签: c# regex

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

itsonlyaexample[0:4:2]test

我只需要提取042

OR

itsonlyaexample[0]test

我只需要提取0

如何使用C#

执行此操作

我已经尝试了这个,但没有得到括号中的数字:

(\[[0-9]{1}\]|\[[0-9]{1}:[0-9]{1}\])

3 个答案:

答案 0 :(得分:3)

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(':');

答案 1 :(得分:2)

您可以在全球研究中使用这种模式:

@"(?:\G(?!\A):|\[)([0-9]+)(?=:|(]))"

demo

该模式使用与前一个匹配结果之后的位置匹配的\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);
   }
}

答案 2 :(得分:1)

如果输入包含平衡括号,那么您可以使用正向前瞻断言来匹配括号内的所有数字。

@"\b\d\b(?=[^\[\]]*\])"

@"\b\d+\b(?=[^\[\]]*\])"

以上正则表达式仅在数字后跟任何字符而非[]零次或多次时匹配该数字,之后必须有结尾{{1}括号。 ]是一个积极的先行断言,它不会消耗任何字符,但它决定了匹配发生的位置。

DEMO

<强>代码:

(?=[^\[\]]*\])

IDEONE

<强>解释

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);
}

<强>更新

\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

从组索引1中获取括号内的数字。

DEMO