2013-10-25 3 views
1

Я пытаюсь найти Guid в строку XML, начиная с AdID =regex.replace - не найти мой шаблон?

Так струна я пытаюсь вытащить из строки XML является AdID = [справ]

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

+0

Вы можете разместить свой входной XML? –

ответ

3

«$ &» в заменяющей строке означает «соответствие из исходной строки» - так что вы по существу заменяете найденную подстроку самой собой. См Substitutions in Regular Expressions

$ & Включает копию всего матча в строке замены

Я не совсем уверен, что вы пытаетесь сделать, но

  • считают используя XML api для синтаксического анализа XML
  • если вы хотите вставить & вручную в формате XML, убедитесь, что это enc правильно оформино
  • вам может понадобиться избежать $ взамен шаблона $$.

Пример получения Invalid 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); 
+0

nice find there – Jonesopolis

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); 
+0

Я действительно начал с этого, и это не сработало, поэтому я попробовал самостоятельно. – rcj

+0

@ user2081737 изменил ответ, чтобы лучше отразить то, что вам нужно. не вложил adid, хотя .... – Leon

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); 
+0

Да, факт, что я даже не нахожу самого руководства, мешал мне даже попытаться добавить часть adid – rcj

+0

Alexei нашел вашу основную проблему. Объедините это Regex с его решением. – Jonesopolis

0

Я не уверен, что должно быть результатом, но если вы хотите иметь строку

AdID = [справ ] - тогда ваш код будет выглядеть следующим образом:

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/ Это бесплатно и просто.

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} 

Если вы не хотите Адид = часть затем удалить его.

+0

Я тестировал: adId = [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} с использованием плагинов notepad ++ regex. –

+1

GUID - это список шестнадцатеричных чисел. Недопустимые символы G-Z. – Ondra

+0

Я исправил его, так что теперь он проходит через f. Спасибо за напоминание. –

0

Попробуйте это: RexFiddle

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

+0

, который может привести к несогласованности, если он был неудачен – Jonesopolis

Смежные вопросы