C#正则表达式模式

C#正则表达式模式,c#,regex,C#,Regex,我有这样一个字符串: String1=[q:6][ilvl:70](randomword) 我需要三种模式来检索ilvl:后面的数字70,q:后面的数字6,还有一种模式来检索所有ascii字符。 我提出了这三种模式,但我失败了,因为它们没有完全符合上述三种模式 string rules_1 = @"(?i)\[ilvl:([0-9]{1,2})\]"; string rules_2 = @"(?i)\[q:([0-9]{1,2})\]"; string rules_3 = @"(?i)\(([

我有这样一个字符串:

String1=[q:6][ilvl:70](randomword)
我需要三种模式来检索ilvl:后面的数字70,q:后面的数字6,还有一种模式来检索所有ascii字符。 我提出了这三种模式,但我失败了,因为它们没有完全符合上述三种模式

string rules_1 = @"(?i)\[ilvl:([0-9]{1,2})\]";
string rules_2 = @"(?i)\[q:([0-9]{1,2})\]";
string rules_3 = @"(?i)\(([[:ascii:]+]+)\)";
第一个检索的是[ilvl:70],而不是70 第二个检索[q:6],而不是6 第三个不检索任何内容,而是检索所有ascii字符

有正则表达式大师能帮我吗


提前感谢。

用一个正则表达式检索所有三个:

^\[[^:]*:([^\]]*)\]\[[^:]*:([^\]]*)\]\(([^)]*)
在中,查看右侧窗格中的捕获组

示例代码:

string s1 = @"[q:6][ilvl:70](randomword)";
Match matchResults = null;
var myRegex = new Regex(@"^\[[^:]*:([^\]]*)\]\[[^:]*:([^\]]*)\]\(([^)]*)");
matchResults = myRegex.Match(s1);
string firstNumber = matchResults.Groups[1].Value;
string secondNumber = matchResults.Groups[2].Value;
string yourASCII = matchResults.Groups[3].Value;
解释

  • ^
    锚定声明我们位于字符串的开头
  • \[^:::*:
    匹配到第一个
  • ([^\]]*)
    捕获组1的第一个值
  • \]\[[^:::*:
    匹配到第二个
  • ([^\]]*)
    捕获组2的第二个值
  • \]\(
    与括号匹配
  • ([^)]*)
    将您的角色捕获到第3组

您的命令需要查找以匹配所有三种情况。你不需要捕捉它

(?:(?<=ilvl:)[^\]]*|(?<=q:)[^\]]*|(?<=\()[^\)]*)
(?:(?您可以使用:

我想你想要任何能帮你解决问题的答案

正则表达式功能强大,但并非总是必需的。

非正则表达式解决方案:

using System;

public class Program
{
  public static void Main()
  {
    string s1=@"[q:6][ilvl:70](randomword)";

    var tmp = s1.Split(new string [] {":","]" }, StringSplitOptions.None);

    string res1 = tmp[1];
    string res2 = tmp[3];

    string res3 = s1.Split(new string [] {"](",")" }, StringSplitOptions.None)[1];

    Console.WriteLine("1 -> "+res1);
    Console.WriteLine("2 -> "+res2);
    Console.WriteLine("3 -> "+res3);
  }
}

fiddle->

您是否确实在查看匹配的“组”值? 匹配将返回匹配的所有内容,而不仅仅是“()”中的内容,组“0”也将返回所有内容

这对我来说就像预期的那样:

string String1="[q:6][ilvl:70](randomword)";

Regex rules_1 = new Regex(@"(?i)\[ilvl:([0-9]{1,2})\]");
Regex rules_2 = new Regex(@"(?i)\[q:([0-9]{1,2})\]");
Regex rules_3 = new Regex(@"(?i)\(([a-zA-Z]+)\)");

var match1 = rules_1.Match(String1);
var match2 = rules_2.Match(String1);
var match3 = rules_3.Match(String1);

var value1 = match1.Groups[1].Value;
var value2 = match2.Groups[1].Value;
var value3 = match3.Groups[1].Value;
请注意,我必须将
[[:ascii:][+]+
更改为
[a-zA-Z]+

你不能嵌套
[]
选择器(这对一个选择器没有意义),我也从来没有见过
:ascii:
,但这会匹配本文中的所有字符(
[
0
7
,等等。也是ascii字符)

@igelineau谢谢!:)所有这些都是很好的解决方案。谢谢大家
using System;

public class Program
{
  public static void Main()
  {
    string s1=@"[q:6][ilvl:70](randomword)";

    var tmp = s1.Split(new string [] {":","]" }, StringSplitOptions.None);

    string res1 = tmp[1];
    string res2 = tmp[3];

    string res3 = s1.Split(new string [] {"](",")" }, StringSplitOptions.None)[1];

    Console.WriteLine("1 -> "+res1);
    Console.WriteLine("2 -> "+res2);
    Console.WriteLine("3 -> "+res3);
  }
}
string String1="[q:6][ilvl:70](randomword)";

Regex rules_1 = new Regex(@"(?i)\[ilvl:([0-9]{1,2})\]");
Regex rules_2 = new Regex(@"(?i)\[q:([0-9]{1,2})\]");
Regex rules_3 = new Regex(@"(?i)\(([a-zA-Z]+)\)");

var match1 = rules_1.Match(String1);
var match2 = rules_2.Match(String1);
var match3 = rules_3.Match(String1);

var value1 = match1.Groups[1].Value;
var value2 = match2.Groups[1].Value;
var value3 = match3.Groups[1].Value;