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

时间:2016-07-08 19:22:00

标签: c# regex winforms wmi wmi-query

我已经看过很多关于这个问题的不同看法,答案会有所不同,具体取决于问题是如何表达的。您可以使用拆分或使用正则表达式来执行此操作。

我正在做的是使用WMI返回主板的BIOSVersion。无论出于何种原因,制造商都会提供更多内容,而不仅仅是版本号。在整个字符串中,版本号位于句点分隔字符串的第三个位置。在第二个位置的值是ALWAYS 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);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:6)

如果版本始终是第3版,这是最简单的方法。

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

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

        Console.WriteLine(arr[2]);
希望很清楚。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

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