【问题标题】:Best way to get all words like @*@ from a string in C#从 C# 中的字符串中获取所有单词(如 @*@)的最佳方法
【发布时间】:2012-08-18 10:40:08
【问题描述】:

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

更新:将仅包含 '@' 之间的整数值。

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

              "@234@ == val1",
              "@3456@ == 345 && @34563@ != 'Y'",
              "@1234@ != val1 || @1234@ != val2 || @1234@ != val3"      

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 使用正则表达式。
  • “用'&&'或'||'分隔的类似字符串”是什么意思?
  • @CuongLe 通过添加示例输入更新了问题
  • @Jom:随着你的更新,我删除了我的第二个 Linq,第一个是正确的。
  • @jom 这 3 个是 only 正确的有效输入!

标签: c# .net regex string linq


【解决方案1】:

尝试:(包括签名值)

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

【讨论】:

    【解决方案2】:

    使用 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));
    

    【讨论】:

    • 您应该在结果末尾添加 .ToList()。
    • 在我的问题中,相邻的 @ 不会出现。那么这项工作还好吗?
    • 可能出现的有效输入字符串是“@some int value@ == val1”或用'&&'或'||'分隔的类似字符串
    【解决方案3】:
    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());
    }
    

    【讨论】:

      【解决方案4】:

      你应该使用的正则表达式:

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

      【讨论】:

        猜你喜欢
        • 2011-02-07
        • 2019-03-03
        • 2012-11-25
        • 2010-10-12
        • 2022-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多