我正在尝试从字符串中获取特定部分。我必须得到以“ @”开头的部分,并且仅包含拉丁字母中的字母。
我想我必须创建一个正则表达式模式,但是我不知道怎么做。
string test = "PQ@Alderaa1:30000!A!->20000";
var planet = "Alderaa"; //what I want to get
string test2 = "@Cantonica:3000!D!->4000NM";
var planet2 = "Cantonica";
我还需要获取其他一些内容,但是我会尝试自己获取。 (以':'开头,是整数;可以是“ A”(攻击)或“ D”(破坏),并且必须用“!”(感叹号)包围;以“->”开头,并且应该是整数)
答案 0 :(得分:4)
您可以使用捕获组获取单独的部分:
@([a-zA-Z]+)[^:]*:(\d+)!([AD])!->(\d+)
这将匹配:
@([a-zA-Z]+)
匹配@
并在组1中捕获1+次a-zA-Z [^:]*:
使用否定的character class匹配0+次而不是:
,然后匹配:
(如果后面的内容可能只是可选数字,您也可以匹配0 +倍数字[0-9]*
)!([AD])!
匹配!,在第3组和A或D中捕获,然后匹配!->(\d+)
匹配->
并捕获第4组1个以上的数字答案 1 :(得分:2)
您可以使用此正则表达式,该正则表达式使用积极的眼神来确保匹配的文本前面带有@
,并使用[a-zA-Z]+
捕获一个或多个字母,并使用积极的眼神来确保它后面跟一些可选的文本,冒号,然后是一个或多个数字,后跟!
,然后是A
或D
,再是一个!
(?<=@)[a-zA-Z]+(?=[^:]*:\d+![AD]!)
string test = "PQ@Alderaa1:30000!A!->20000";
Match m1 = Regex.Match(test, @"(?<=@)[a-zA-Z]+(?=[^:]*:\d+![AD]!)");
Console.WriteLine(m1.Groups[0].Value);
test = "@Cantonica:3000!D!";
m1 = Regex.Match(test, @"(?<=@)[a-zA-Z]+(?=[^:]*:\d+![AD]!)");
Console.WriteLine(m1.Groups[0].Value);
打印
Alderaa
Cantonica
答案 2 :(得分:2)
您已经有了一个不错的答案,但是我想添加一个新的名称来显示命名的捕获组。
您可以为您的行星创建一个类,例如
class Planet
{
public string Name;
public int Value1; // name is not cleat from context
public string Category; // as above: rename it
public string Value2; // same problem
}
现在您可以将正则表达式与命名组一起使用
@(?<name>[a-z]+)[^:]*:(?<value1>\d+)!(?<category>[^!]+)!->(?<value2>[\da-z]+)
用法:
var input = new[]
{
"PQ@Alderaa1:30000!A!->20000",
"@Cantonica:3000!D!->4000NM",
};
var regex = new Regex("@(?<name>[a-z]+)[^:]*:(?<value1>\\d+)!(?<category>[^!]+)!->(?<value2>[\\da-z]+)",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
var planets = input
.Select(p => regex.Match(p))
.Select(m => new Planet
{
Name = m.Groups["name"].Value, // here and further we can access to part of input string by name
Value1 = int.Parse(m.Groups["value1"].Value),
Category = m.Groups["category"].Value,
Value2 = m.Groups["value2"].Value
})
.ToList();