从字符串中抓取特定位置的最佳方法
本文关键字:位置 最佳 方法 定位 字符串 抓取 | 更新日期: 2023-09-27 17:56:14
我已经研究了关于这个问题的大量不同看法,答案因问题的措辞而异。 您似乎可以使用 split 或使用正则表达式来执行此操作。
我正在做的是使用 WMI 返回主板的 BIOSVersion。 无论出于何种原因,制造商投入的不仅仅是版本号。 在整个字符串中,版本号位于句点分隔字符串的第三个位置。 在第二个位置的值始终是 86A。 在此示例中,版本实际上是 0460.SIX7910J.86A.0460.2012.0327.1627
。
那么,关于我正在做的事情,哪个是"最佳实践"? 查询表达式中的正则表达式,循环使用拆分的结果或我尚未找到的其他内容?
作为参考,下面是我正在使用的 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 个,这是最简单的方法。
string s = "SIX7910J.86A.0460.2012.0327.1627";
string[] arr = s.Split('.');
Console.WriteLine(arr[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
,请参阅 regex101.com 上的演示。
在我看来,当您有机会仅使用 String 方法实现字符串操作时(并且实现并不复杂),那就去做吧,不要使用正则表达式。这是因为大多数方法使用低级C++实现,而正则表达式会导致更多的开销。您的整个代码大约需要 50 毫秒,因此我认为没有必要对其进行更多优化。只需将其添加到您的循环中:
foreach (String arrValue in arrBIOSVersion)
{
string[] split = arrValue.Split('.');
string version;
if (split.Length > 3)
version = split[2];
}