2015-10-15 2 views
0

Эй, ребята, я довольно новичок в использовании regexp. Поэтому, пожалуйста, несите меня, если некоторые из моих вопросов очень просты. Мне нужно отфильтровать большой файл для некоторых данных. Часть файла данных выглядит следующим образомМногострочное регулярное выражение в matlab

<abcd.....z> 
    <xyz123....etc..etc/> 
    <xyz123....etc..etc/> 
    . 
    . 
    many more 
    . 
    <xyz123....etc..etc/> 
</node> 
<abcd.....z/> 
<abcd.....z/> 
<abcd.....z/> 
<abcd.....z/> 
<abcd.....z> 
    <xyz123....etc..etc/> 
</node> 
<abcd.....z/> 

и эта картина повторяется несколько раз.

Мое требование состоит в том, чтобы получить первые <abcd.....z> выше </node> вместе с данными между ними (т. Е. Все <xyz123....etc..etc/>).

Для например выхода 1:

<abcd.....z> 
    <xyz123....etc..etc/> 
    <xyz123....etc..etc/> 
    . 
    . 
    many more 
    . 
    <xyz123....etc..etc/> 

выход 2:

<abcd.....z> 
    <xyz123....etc..etc/> 

Я использовал этот положительный оператор взгляд вперед

<abcd.*?>(?=</node>) 

Но главная проблема состоит в том, что выход включает <abcd.....z>, которые не имеют <xyz123....etc..etc/> под ними. т.е. выход следующим образом выхода 1:

<abcd.....z> 
    <xyz123....etc..etc> 
    <xyz123....etc..etc> 
    . 
    . 
    many more 
    . 
    <xyz123....etc..etc> 

выход 2:

<abcd.....z/> 
<abcd.....z/> 
<abcd.....z/> 
<abcd.....z/> 
<abcd.....z> 
    <xyz123....etc..etc> 
</node> 

Если вы заметили на выходе 2 я не нужен первые 4 <abcd.....z/> «с. Мне нужен только последний, т. Е. выход должен быть

<abcd.....z> 
    <xyz123....etc..etc> 

Снова извините за длинный пост и надеюсь, что кто-то может мне помочь здесь!

Thnaks to @digitalLink У меня есть правильное выражение.
Это (<abcd\.*z>(.|\n)*?)(?=<\/node>)

Это прекрасно работает с онлайн-инструментами, такими как regexr и regexp101. Я заметил, что оба инструмента используют g-модификатор (глобальный модификатор) в конце выражения reg. Я понимаю, что флаг выражения/g повторно заполняет индекс последнего совпадения, позволяя итеративный поиск.

Возможно ли это в Matlab? Должен ли я использовать g-модификатор явно в matlab? Что такое эквивалентный флаг выражения в matlab

Не мог бы кто-нибудь помочь мне здесь. Я новичок в Matlab и не могу это понять!

ответ

0

Я думаю, что это выражение Regex может быть тем, что вы ищете. Дайте мне знать, как это работает.

"(<abcd\.*z>(.|\n)*?)(?=<\/node>)" 

Обязательно включите многострочный флаг.

Попробуй здесь: http://regexr.com/3c0aj

+0

Эй! спасибо за выражение. Когда я проверяю онлайн-инструменты, такие как regexr.com или regex101.com, он работает как шарм.Но когда я использую его в своей программе в Matlab, это не работает. Я заметил, что и regexr.com, и regexp101.com используют g-модификатор (глобальный модификатор) в конце выражения reg, которое вы поделили. Должен ли я использовать g-модификатор явно в Matlab? Если да, можете ли вы рассказать мне, как я могу это сделать? Еще раз спасибо –

+0

Я понимаю, что флаг выражения/g заново заполняет индекс последнего совпадения, позволяя итеративный поиск. Возможно ли это в Matlab? если да, то какой эквивалентный флаг выражения в Matlab и как его можно использовать с выражением, которым вы поделились? –

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