Помогите с регулярным выражением, которое совпадает с чем-либо до или после чего-то еще - PullRequest
4 голосов
/ 13 октября 2008

У меня есть набор XML, в котором есть строки, которые выглядят следующим образом

<_char font_name="/ITC Stone Serif Std Bold" italic="true" />

но иногда выглядит так

<_char font_size="88175" italic="true" font_name="/ITC Stone Serif Std Bold" />

Вот что мне нужно сделать

  • Заменить italic = "true" на italic = "false для каждой строки, содержащей ITC Stone Serif Std Bold , независимо от того, предшествует ли ИЛИ после курсив часть.

Можно ли это сделать с помощью одного регулярного выражения?

Я не ищу решение в режиме реального времени. У меня просто тонна XML-файлов, в которых есть эта «ошибка», и я пытаюсь выполнить глобальный поиск и замену с PowerGrep, для которого потребуется одно регулярное выражение. Если скриптинг - единственный способ сделать это, пусть будет так.

Ответы [ 5 ]

3 голосов
/ 13 октября 2008

Имеет ли простое использование '|' оператор удовлетворяет вас?

name="/ITC Stone Sans Std Bold"[^>]italic="(true)"|italic="(true)"[^>]font_name="/ITC Stone Serif Std Bold"

Это должно обнаружить любую строку с именем атрибута до или после атрибута курсив со значением true.

1 голос
/ 13 октября 2008

Ну, в общем, использование RE для разбора XML не очень хорошая идея. Но если вы действительно хотите, самый простой способ - сделать это в две строки:

if (/ITC Stone Serif Std Bold/) {
   s/italic="true"/italic="false"/g;
}
0 голосов
/ 16 октября 2008

Perl 5.10

Использование новых функций Perl 5.10.

s(
 <_char \s* [^>]*? \K (?: (?&font) \s+ (?&italic) | (?&italic) \s+ (?&font) )
 (?(DEFINE)
  (?<font>font_name="/ITC[ ]Stone[ ]Serif[ ]Std[ ]Bold")
  (?<italic>italic="true")
 )
){
 $+{font} . 'italic="false"'
}xge

Предупреждение: не проверено.

0 голосов
/ 13 октября 2008
Pattern: /(<_char(?=(?:\s+\w+="[^"]*")*?\s+font_name="[^"]*?ITC Stone Serif Std Bold[^"]*")(?:\s+\w+="[^"]*")*?\s+italic=")true(?=")/
Replacement: '$1false'
0 голосов
/ 13 октября 2008

В Perl - не проверено:

while (<>)
{
    s/italic="true"/italic="false"/ if m%font_name="/ITC Stone Sans Std Bold" italic="true"|italic="true" font_name="/ITC Stone Serif Std Bold"%;
    print;
}

Очень простой подход - может потребоваться глобальный квалификатор, может потребоваться более сложная замена, если другие части этой строки могут содержать опции курсива.

Также - мысль - следует ли вам воспользоваться этой возможностью, чтобы сделать обозначение единообразным, поэтому всегда ставьте курсив перед (или позади) именем шрифта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...