从字符串中获取特定位置的最佳方法

问题描述:

我已经看过在这个问题上的各种不同的需求,答案因问题的表达方式而有所不同。看起来你可以使用split或使用正则表达式来完成此操作。从字符串中获取特定位置的最佳方法

我在做什么是使用WMI返回主板的BIOSVersion。无论出于何种原因,制造商都会在版本号中加入更多内容。在整个字符串中,版本号位于周期分隔字符串的第三个位置。在第二个位置的价值是总是86A。在这个例子中,版本实际上是0460.SIX7910J.86A.0460.2012.0327.1627

那么,对于我在做什么而言,这将是“最佳实践”?查询表达式中的正则表达式,循环使用split或其他我还没找到的结果?

仅供参考,这里是我正在使用的C#WMI代码。示例代码使用Windows窗体,因为这是WMI代码创建者输出的内容。我将在WPF项目中使用它,但我不知道这对于问题的本质来说意味着太多。我想我可以制定出所需的代码,但我试图去了解哪种方式是最好的方式。

感谢您提供的任何帮助。如果代码没有全部显示在代码块中,我很抱歉。我认为我遵循了如何做到这一点的说明,但在代码块的示例显示中,它在代码块中有一点点代码,然后转到正常文本,然后返回到代码块。希望实际的渲染更清晰。

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       ManagementObjectSearcher searcher = 
        new ManagementObjectSearcher("root\\CIMV2", 
        "SELECT BIOSVersion FROM Win32_BIOS"); 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Win32_BIOS instance"); 
        Console.WriteLine("-----------------------------------"); 

        if(queryObj["BIOSVersion"] == null) 
         Console.WriteLine("BIOSVersion: {0}", queryObj["BIOSVersion"]); 
        else 
        { 
         String[] arrBIOSVersion = (String[])(queryObj["BIOSVersion"]); 
         foreach (String arrValue in arrBIOSVersion) 
         { 
          Console.WriteLine("BIOSVersion: {0}", arrValue); 
         } 
        } 
       } 
      } 
      catch (ManagementException e) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
      } 
     } 
    } 
} 
+0

使用字符串方法IndexOf()来查找“86A”。使用Substring来获取字符串。在Regex之前总是使用简单的String方法。当字符串方法变得复杂时,使用Regex。如果合理使用String方法和Regex组合,没有什么不妥。 – jdweng

+0

与您的实际问题无关,但在测试后显示'queryObj [“BIOS版本]'是否为空(或者我错过了什么?) – Sehnsucht

+0

这可能不用说了,但实际的”BIOSVersion“取决于制造商。在我的机器上,它是一个连字符分隔的列表。 –

这是最简单的方法,如果版本总是从第3个开始。

string s = "SIX7910J.86A.0460.2012.0327.1627"; 

     string[] arr = s.Split('.'); 

     Console.WriteLine(arr[2]); 

希望这是显而易见的。

+0

非常明确,确实:) – Jan

+0

感谢大家的回复。几乎所有的回复都很棒!它帮助我澄清了很多事情。 – Kevin

在我看来,当你有机会只使用String方法来实现字符串操作(并且实现并不复杂),那就去做吧,不要使用正则表达式。这是因为大多数方法使用低级C++实现,而Regex会导致更多开销。你的整个代码需要大约50ms,所以我没有看到任何需要更多地优化它。只需将其添加到您的循环中:

foreach (String arrValue in arrBIOSVersion) 
{ 
    string[] split = arrValue.Split('.'); 

    string version; 
    if (split.Length > 3) 
     version = split[2]; 
} 

第一:使用@Saket的方法,很明显,易于阅读和理解。
为了完整起见,这里是一个正则表达式的方法,但是:

(?:[^.]+\.){2}\K # match anything not a dot, followed by a dot 
       # two times and throw it away afterwards 
([^.]+)   # match anything not a dot 

这给你0460,看到a demo on regex101.com

+1

非常有用的链接正则表达式,即时书签。感谢分享。 –