【问题标题】:Parsing GUID from string line从字符串行解析 GUID
【发布时间】:2012-05-23 02:07:06
【问题描述】:

我有不同的选择如何将我的 GUIDS 存储为字符串。

1. Accessibility|5102d73a-1b0b-4461-93cd-0c024738c19e
2. 5102d73a-1b0b-4461-93cd-0c024738c19e;#5102d73a-1b0b-4461-93cd-0c024733d52d
3. |;#5102d73a-1b0b-4461-93cd-0c024738c19e;#SharePointTag|5102d73a-1b0b-4461-93cd-0c024733d52d
3. Business pages|;#5102d73a-1b0b-4461-93cd-0c024738cz13;#SharePointTag|5102d73a-1b0b-4461-93cd-0c024733d52d

你们能帮我想想如何解析这个标签并最终获得 Guids 类型的列表吗?也许正则表达式可以在这种情况下有所帮助?

【问题讨论】:

  • 您是否使用了您提供给我们的所有示例?或者您是否希望选择其中一个示例作为存储 guid 的一种方式?您能否提供更多有关您正在尝试做的事情的信息。
  • 查看您的数据结构,我认为您需要先对数据结构进行排序,然后确定要使用的分隔符。我可以看到| , ; #

标签: c# regex parsing


【解决方案1】:

看起来您正在使用托管元数据、术语库 ID 和术语集 ID :)

只需使用常规正则表达式(下面的“p”变量):

string c1 = "Accessibility|5102d73a-1b0b-4461-93cd-0c024738c19e";
string c2 = "5102d73a-1b0b-4461-93cd-0c024738c19e;#5102d73a-1b0b-4461-93cd-0c024733d52d";
string c3 = "|;#5102d73a-1b0b-4461-93cd-0c024738c19e;#SharePointTag|5102d73a-1b0b-4461-93cd-0c024733d52d";
string c4 = "Business pages|;#5102d73a-1b0b-4461-93cd-0c024738cz13;#SharePointTag|5102d73a-1b0b-4461-93cd-0c024733d52d";
string p = @"([a-zA-Z0-9]{8}[-][a-zA-Z0-9]{4}[-][a-zA-Z0-9]{4}[-][a-zA-Z0-9]{4}[-][a-zA-Z0-9]{12})";

MatchCollection mc;

Console.WriteLine("#1");
mc = Regex.Matches(c1, p);
foreach (var id in mc)
    Console.WriteLine(id);

Console.WriteLine("#2");
mc = Regex.Matches(c2, p);
foreach (var id in mc)
    Console.WriteLine(id);

Console.WriteLine("#3");
mc = Regex.Matches(c3, p);
foreach (var id in mc)
    Console.WriteLine(id);

Console.WriteLine("#4");
mc = Regex.Matches(c4, p);
foreach (var id in mc)
    Console.WriteLine(id);

输出:

#1
5102d73a-1b0b-4461-93cd-0c024738c19e
#2
5102d73a-1b0b-4461-93cd-0c024738c19e
5102d73a-1b0b-4461-93cd-0c024733d52d
#3
5102d73a-1b0b-4461-93cd-0c024738c19e
5102d73a-1b0b-4461-93cd-0c024733d52d
#4
5102d73a-1b0b-4461-93cd-0c024738cz13
5102d73a-1b0b-4461-93cd-0c024733d52d
Press any key to continue...

【讨论】:

  • 您在模式的最后部分缺少 A-Z,正确的应该是 ([a-zA-Z0-9]{8}[-][a-zA-Z0-9]{4}[-][a-zA-Z0-9]{4}[-][a-zA-Z0-9]{4}[-][a-zA-Z0-9]{12})
【解决方案2】:
var possibleGuids = myString.Split("|;#".ToCharArray(), 
                                   StringSplitOptions.RemoveEmptyEntries);
Guid g;
foreach(var poss in possibleGuids)
{
  if(Guid.TryParse(poss, out g))
  {
      // g contains a guid!
  }
}

【讨论】:

    【解决方案3】:
    string sContent = "your data"; // any of your four forms of input
    string sPattern = @"([a-z0-9]*[-]){4}[a-z0-9]*";
    
    MatchCollection mc = Regex.Matches(sContent, sPattern );
    
    foreach (var sGUID in mc)
    {
        // Do whatever with sGUID
    }
    

    【讨论】:

    • 5102d73a-1b0b-4461-93cd-0c024738cz13 将传递您的模式,但 Guid.TryParse 返回 false 相同。
    • 很好的解决方案!谢谢。但是有一个错误,它只返回了 guid:5102d73a-1b0b-4461-93cd 的一部分
    【解决方案4】:

    例如可以拆分字符串

     "fist|second".Split('|')
    

    您一旦获得 GUID 字符串,就可以使用

    将其转换为 GUID
     Guid = new Guid(myString);
    

    第一行

    var guid = new Guid("Accessibility|5102d73a-1b0b-4461-93cd-0c024738c19e".Split("|")[1]);
    

    第二行

    var myArray = "5102d73a-1b0b-4461-93cd-0c024738c19e;#5102d73a-1b0b-4461-93cd-0c024733d52d".Split(';');
    var guid1 = new Guid(myArray[0]);
    var guid2 = new Guid(myArray[1].Replace('#',''));
    

    所以你可以这样继续..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多