2015-04-14 2 views
0

Я хотел бы спросить, какие Regex я могу использовать для того, чтобы расщепляет строку текста на <math xmlns='http://www.w3.org/1998/Math/MathML'>....</math>ведьма Regex я могу использовать, чтобы разбить строку XML до и после матча MathML

результат будет:

enter image description here

код:

 var text = @"{(test&<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><plus></plus><cn>1</cn><cn>2</cn></apply></math>)|(<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><root></root><degree><ci>m</ci></degree><ci>m</ci></apply></math>&nnm)&<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><power></power><cn>1</cn><cn>2</cn></apply></math>#<math xmlns='http://www.w3.org/1998/Math/MathML'><set><ci>l</ci></set></math>}"; 
     string findTagString = "(<math.*?>)|(.+?(?=<math/>))"; 
     Regex findTag = new Regex(findTagString); 
     List<string> textList = findTag.Split(text).ToList(); 

Я нашел аналогичный вопрос на Using Regex to split XML string before and after match и я хотел бы спросить, п или совет о Regex выражения

Спасибо

Ori

+3

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/ имеют гораздо лучшие объяснения тому, что вам нужно знать о разборе XML с помощью регулярных выражений. Обязательно прочитайте хотя бы 20 ответов. –

ответ

0

после некоторых тестов, я думаю, что это будет делать работу:

string findTagString = "(<math.*?></math>)|((.*){}()#&(.*))</math>"; 
0

Вот моя попытка, основанная на ноль -длина взгляд вперед и смотреть-за:

(?=<math[^>]*>)|(?<=</math>) 

Код:

string findTagString = "(?=<math[^>]*>)|(?<=</math>)"; 
var text = @"{(test&<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><plus></plus><cn>1</cn><cn>2</cn></apply></math>)|(<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><root></root><degree><ci>m</ci></degree><ci>m</ci></apply></math>&nnm)&<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><power></power><cn>1</cn><cn>2</cn></apply></math>#<math xmlns='http://www.w3.org/1998/Math/MathML'><set><ci>l</ci></set></math>}"; 
Regex findTag = new Regex(findTagString); 
string[] textList = findTag.Split(text); 
Console.WriteLine(string.Join("\n", textList)); 

Выход из sample program:

{(test&                                        
<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><plus></plus><cn>1</cn><cn>2</cn></apply></math>                
)|(                                         
<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><root></root><degree><ci>m</ci></degree><ci>m</ci></apply></math>           
&nnm)&                                        
<math xmlns='http://www.w3.org/1998/Math/MathML'><apply><power></power><cn>1</cn><cn>2</cn></apply></math>               
#                                         
<math xmlns='http://www.w3.org/1998/Math/MathML'><set><ci>l</ci></set></math>                      
}  
0

Я бы не советовал пытаться использовать регулярные выражения с XML. XML не является regular language и поэтому не подходит для регулярных выражений. В любом случае .NET дает такие удобные инструменты для синтаксического анализа XML, что я действительно не вижу смысла.

Я предлагаю использовать LINQ to XML вместо регулярных выражений.

+0

Привет, Мотти, спасибо за ваш совет. вход i get представляет собой строку xml. это означает, что это не допустимый xml, и я не могу использовать какой-либо синтаксический анализ xml в коде. единственный способ сделать то, что мне нужно сделать, - использовать Regex или сложную подстроку. Regex проще и быстрее. – Ori

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