1

我正在尝试在以 adid= 开头的 xml 字符串中查找 guid

所以我试图从 xml 字符串中提取的字符串是 adid=[guid]

guid 是 8 位十六进制、4 位十六进制、4 位十六进制、4 位十六进制和 12 位十六进制,用破折号分隔,例如,我的测试字符串中的一个是 adId=38d96c20-2515-41b4-a181-15588e3d7c1e

我是使用 Regex 的新手,所以如果它是基本的东西,我不会感到惊讶。

这是我的代码:

var adid = Regex.Replace(xmlString,
                         @"adid=[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}",
                         "$&",
                         RegexOptions.IgnoreCase);

//adid is now the same string as xmlString

我究竟做错了什么?

输入:

fawetreawfafadidadid=38d96c20-2515-41b4-a181-15588e3d7c1e1231d21d12f1g

应该返回:adid=38d96c20-2515-41b4-a181-15588e3d7c1e

4

6 回答 6

3

替换字符串中的“$&”表示“与源字符串匹配”-因此您实际上是将找到的子字符串替换为自身。请参阅正则表达式中的替换

$&在替换字符串中包含整个匹配项的副本

我不确定您要做什么,但是

  • 考虑先使用 XML api 解析 XML
  • 如果您想&在 XML 中手动插入,请确保它已正确编码
  • 您可能需要$在替换模式中转义$$

产生无效 xml的示例:

var adid = Regex.Replace(xmlString,
    @"[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}",
   "$$&", // notice "$$" for escaped "$"
    RegexOptions.IgnoreCase);
于 2013-10-25T19:29:53.083 回答
1

如果你想保证adid=在 guid 之前,你需要一个积极的后视:

string test =  Regex.Replace("aslkjfhasdfkasdadId=38d96c20-2515-42b4-a181-15588e3d7c1e",
                     @"(?<=adid=)[A-F\d]{8}-[A-F\d]{4}-[A-F\d]{4}-[A-F\d]{4}-[A-F\d]{12}",
                     "",
                     RegexOptions.IgnoreCase);
于 2013-10-25T19:26:56.037 回答
0

尝试

Regex.Replace(xmlString, 
              @"^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$, 
              "'$0'", 
              RegexOptions.IgnoreCase); 
于 2013-10-25T19:24:03.363 回答
0

我不确定结果应该是什么,但如果你想要一个字符串

adid=[guid] - 那么您的代码将如下所示:

Regex.Replace(xmlString, 
              @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b", 
              "[guid]", 
              RegexOptions.IgnoreCase); 

如果您只想获得 guid,那么您不需要更换

Regex.Match(xmlString, 
              @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b", 
              RegexOptions.IgnoreCase); 

为了测试正则表达式,我推荐使用这个软件:http ://www.radsoftware.com.au/regexdesigner/它是免费且简单的。

于 2013-10-25T19:29:12.260 回答
0

我的 2 美分:

adId=[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}

如果您不想要 adId= 部分,请将其删除。

于 2013-10-25T19:30:08.343 回答
0

试试这个: RexFiddle

\S{8}-\S{4}-\S{4}-\S{4}-\S{12}

于 2013-10-25T19:33:32.587 回答