我有一个字符串,如“@ 1234 @ == val1&& @ 2312 @!= val2”。我希望得到1234和2312,它们使用'@'嵌入到一个数组中。该字符串可以包含使用“@”嵌入的多个项目。
更新:仅包含“@”之间的整数值。
update2 :可能出现的有效输入字符串是“@some int value @ == val1”或类似的以“&&”分隔的字符串或'||' 示例输入字符串:
"@234@ == val1",
"@3456@ == 345 && @34563@ != 'Y'",
"@1234@ != val1 || @1234@ != val2 || @1234@ != val3"
实现这一目标的最佳方法是什么?
答案 0 :(得分:5)
尝试:(包括签名值)
//string patt = "@(?<value>.*?)@";
// string patt = "@(?<value>\\d*?)@"; // just number values (if there should be an integer use + instead of *)
//string patt = "@(?<value>[+|-]?\\d*?)@";
//string str = "@1234@ == val1 && @-2312@ != val2 && @+23@ != val3";
string patt = "@(?<value>[+|-]?\\d+?)@\\s[==|!=].*?(&&|\\|\\||$){1}";
string str = "@1234@ == val1 && @-2312@ != val2 && @+78@ != val3 || @45@ == 446";
Regex r = new Regex(patt);
string str = "@1234@ == val1 && @2312@ != val2";
MatchCollection mc = r.Matches(str);
List<string> lst = new List<string>();
foreach (Match item in mc)
{
string value = item.Groups["value"].Value;
lst.Add(value);
}
答案 1 :(得分:1)
使用LINQ的另一种方式:
var list = input.Split(new[] { '@' }, StringSplitOptions.RemoveEmptyEntries);
var result = Enumerable.Range(0, list.Length / 2)
.Select(i => list.ElementAt(i*2));
如果您的输入如下:
"@12@@34@ == val1 && @2312@ != val2"
你可以在Linq下面使用这个:
var list = input.Split(new[] { "==", "!=", "&&", "||" },
StringSplitOptions.RemoveEmptyEntries);
var result = Enumerable.Range(0, list.Length/2)
.Select(i => list.ElementAt(i*2).Trim())
.Select(s => s.Substring(1, s.Length - 2));
答案 2 :(得分:1)
List<int> l=new List<int>();
string s="@1@ == val1 && @2@ != val2 || @3@ == val1";
Regex r=new Regex(@"(?<=@)[\d\s]+(?=@\s(==|!=).*?(&&|\|\||$){1})");
foreach(Match m in r.Matches(s))
{
l.AddRange(Regex.Split(m.Value,@"(?=\d)").Where(i=>i!="").Select(i=>int.Parse(i.Replace(" ",""))).ToList());
}
答案 3 :(得分:0)
你应该使用正则表达式:
(?<=@)[0-9]+(?=@)