Как заменить элемент между двумя разделителями в TextWrangler - PullRequest
2 голосов
/ 04 ноября 2011

Я хочу заменить фонетический символ между слонами фонетической транскрипции следующим образом:

/anycharacter*ou*anycharacter/

до

/anycharacter*au*anycharacter/

Я имею в виду, что я хочу заменить "ou" на "au" между любыми двумя фонетическими слешами во всех случаях. Например:

<font size=+2 color=#E66C2C> jocose /dʒə'kous/</font>
    =  suj vour ver / suwj dduaf 

в

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font>
    =  suj vour ver / suwj dduaf  
  • Текстовый файл содержит HTML-код и некоторые текстовые косые черты (например, A / B вместо A или B)
  • Строка "anycharacter" может быть любым символом, одним или несколькими символами или без них. Например: / folou /, / houl /, / sou /, /dʒə'kousnis/...

До сих пор я использовал:

Find: \/(.*?)\bou*\b(.*?)\/\s
Replace: /\1au\2\3\4/ 

но он находит все строки между любыми /.../, включая обычные слеши и HTLM, и при замене обходит такие элементы, как / gou /, / tou /, ect. Как и в приведенном выше примере, вывод:

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font>
    =  suj vaur ver / suwj dduaf 

Примечание: это "vour" перед заменой обычного слэша на "vaur" не моя цель.

Не могли бы вы подсказать мне, как решить вышеуказанную проблему? Большое спасибо.

1 Ответ

7 голосов
/ 04 ноября 2011

Самое простое выражение соответствия, которое может удовлетворить ваши потребности (соответствует POSIX ERE):

(/[^ \t/<>]*?)ou([^ \t/<>]*?/)

сломан, это означает:

(             # Capture the following into back-reference #1
  /           #   match a literal '/'
  [^ \t<>]    #   match any character that is not a space, tab, slash, or angle bracket...
    *?        #     ...any number of times (even zero times), being reluctant
)             # end capture
ou            # match the letters 'ou'
(             # Capture the following into back-reference #2
  [^ \t/<>]   #   match any character that is not a space, tab, slash, or angle bracket...
    *?        #     ...any number of times (even zero times), being reluctant
  /           #   match a literal '/'
)             # end capture

Затем используйте выражение замены \1au\2

Это будет игнорировать текст между / символами, если между ними будет пробел, табуляция, угловые скобки (< и >) или другая косая черта (/). если есть другие символы, которые, как вы знаете, не встречаются ни в одном из этих выражений, добавьте их в классы символов (группы [])

В моем эмуляторе получается такой текст:

<font size=+2 color=#E66C2C> jocose /dʒə'kous/</font>
    =  suj vour ver / suwj dduaf. 
Either A/B or B/C might happen, but <b>at any time</b> C/D might also occur

... в этот текст:

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font>
    =  suj vour ver / suwj dduaf. 
Either A/B or B/C might happen, but <b>at any time</b> C/D might also occur

Просто спросите, есть ли что-то, чего вы не понимаете! Если хотите, я также могу объяснить несколько проблем с той, которую вы пытались использовать ранее.

EDIT:

Вышеприведенное выражение соответствует всему фонетическому набору транскрипции и полностью его заменяет, используя определенные части совпадения и заменяя другие. Следующая попытка матча начнется после текущего матча.

По этой причине, если ou может встречаться более одного раза в фонетическом выражении с разделением /, вышеприведенное регулярное выражение необходимо будет запускать несколько раз. Для однократного выполнения язык или инструмент должны поддерживать как переменной длины упреждающий просмотр, так и обратный просмотр (общий просмотр)

Насколько я знаю, это только Microsoft .Net Regex и JGSoft "привкус" regex (в таких инструментах, как EditPad Pro и RegexBuddy). POSIX (который требуется для UNIX grep) не поддерживает какой-либо вид, а Python (который я THINK TextWrangler использует) не поддерживает переменную длину просмотр. Я считаю, что это было бы невозможно без осмотра переменной длины.

Выражение, которое требует осмотра переменной длины и делает то, что вам нужно, может выглядеть следующим образом:

(?<=/[^ \t/<>]*?)ou(?=[^ \t/<>]*?/)

... и выражение замены также необходимо изменить, поскольку вы сопоставляете (и, следовательно, заменяете) только те символы, которые должны быть заменены:

au

Он работает практически так же, за исключением того, что он соответствует только ou, затем выполняет проверку (называемую утверждением нулевой ширины) до , чтобы убедиться, , что ему непосредственно предшествует /, и любое количество определенных символов, за которым сразу следует любое количество определенных символов, а затем /.

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