Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C中的字符串中获取像@*@这样的所有单词的最佳方法#_C#_.net_Regex_String_Linq - Fatal编程技术网

C# 从C中的字符串中获取像@*@这样的所有单词的最佳方法#

C# 从C中的字符串中获取像@*@这样的所有单词的最佳方法#,c#,.net,regex,string,linq,C#,.net,Regex,String,Linq,我有一个类似于“@1234@==val1&&@2312@!=val2”的字符串。我想得到1234和2312,它们是使用“@”嵌入到数组中的。字符串可以包含多个使用“@”嵌入的项 更新:将只包含介于“@”之间的整数值 update2:可能出现的有效输入字符串是“@some int value@==val1”或类似类型的字符串,用“&&&”或“||”分隔 输入字符串示例: "@234@ == val1", "@3456@ == 345 &

我有一个类似于“@1234@==val1&&@2312@!=val2”的字符串。我想得到1234和2312,它们是使用“@”嵌入到数组中的。字符串可以包含多个使用“@”嵌入的项

更新:将只包含介于“@”之间的整数值


update2:可能出现的有效输入字符串是“@some int value@==val1”或类似类型的字符串,用“&&&”或“||”分隔 输入字符串示例:

              "@234@ == val1",
              "@3456@ == 345 && @34563@ != 'Y'",
              "@1234@ != val1 || @1234@ != val2 || @1234@ != val3"      
实现这一点的最佳方法是什么?

尝试:(包括签名的值)

//字符串patt=“@(?.*?”@”;
//字符串patt=“@(?\\d*?)@”//仅使用数字值(如果应该是整数,则使用+而不是*)
//字符串patt=“@(?[+|-]?\\d*?)@”;
//string str=“@1234@==val1&&&@-2312@!=val2&&@+23@!=val3”;
字符串patt=“@(?[+\124;-]?\\ d+?)@\\s[====!=].*(&&&&&\\\\\\\\\\\\\\\$){1}”;
string str=“@1234@==val1&&-2312@!=val2&&&+78@!=val3||45@==446”;
正则表达式r=新正则表达式(patt);
string str=“@1234@==val1&&@2312@!=val2”;
MatchCollection mc=r.Matches(str);
List lst=新列表();
foreach(匹配mc中的项目)
{
字符串值=项。组[“值”]。值;
一、增加(价值);
}

使用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));
List l=新列表();
字符串s=“@1@==val1&&@2@!=val2|124;@3@==val1”;

Regex r=新的Regex(@)(?正则表达式您应该使用:

(?<=@)[0-9]+(?=@)

(?使用正则表达式。它是什么意思“类似类型的字符串以“&&”或“| |”分隔?”?@CuongLe通过添加示例更新了问题inputs@Jom:随着您的更新,我删除了第二个Linq,第一个是正确的。@jom这3个是唯一正确的有效输入!您应该添加.ToList()在结果的结尾。在我的问题中,相邻的@将不存在。那么这工作正常吗?可能出现的有效输入字符串是“@some int value@==val1”或类似类型的字符串,用“&&”或“| |”分隔
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());
}
(?<=@)[0-9]+(?=@)