Как да замените елемент между два разделителя в TextWrangler

Искам да заменя фонетичен символ между наклонени черти на фонетична транскрипция като този:

/anycharacter*ou*anycharacter/

to

/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/ и т.н. Както в горния пример, изходът е:

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

Забележка: че "vour" преди нормалната наклонена черта се заменя с "vaur" не е моята цел.

Бихте ли ме насочили как да разреша горния проблем? Благодаря много.


person Niamh Doyle    schedule 04.11.2011    source източник


Отговори (1)


Най-простият израз за съвпадение, който може да задоволи вашите нужди (съвместим с 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

Просто попитайте, ако има нещо, което не разбирате! Ако желаете, мога също да обясня няколко проблема с този, който се опитвахте да използвате преди.

РЕДАКТИРАНЕ:

Горният израз съвпада с целия набор от фонетична транскрипция и го замества изцяло, като използва определени части от съвпадението и заменя други. Следващият опит за мач ще започне след текущия мач.

Поради тази причина, ако ou може да се появи повече от веднъж във фонетичен израз с разделители /, горният регулярен израз ще трябва да се изпълни многократно. За еднократно изпълнение езикът или инструментът трябва да поддържа както променлива дължина поглед напред, така и поглед назад (наричани колективно поглед наоколо)

Доколкото знам, това е само .Net Regex на Microsoft и JGSoft "вкусът" на regex (в инструменти като EditPad Pro и RegexBuddy). POSIX (който UNIX grep изисква) не поддържа никакъв вид поглед наоколо, а Python (който МИСЛЯ използва TextWrangler) не поддържа преглед на променлива дължина. Вярвам, че не би било възможно без оглед с променлива дължина.

Израз, който изисква преглед с променлива дължина и прави това, от което се нуждаете, може да бъде като този:

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

... и заместващият израз също ще трябва да бъде променен, тъй като съпоставяте (и по този начин замествате) само знаците, които трябва да бъдат заменени:

au

Работи почти по същия начин, с изключение на това, че съвпада само с ou, след което изпълнява проверка (наречена твърдение с нулева ширина), за да се увери, че е непосредствено предшествано от / и произволен брой определени знаци, и непосредствено последвано от произволен брой определени знаци, след което /.

person Code Jockey    schedule 04.11.2011
comment
Ти си номер 1! Работи като чар. Наистина много благодаря! Има обаче незначителен проблем: намира и заменя по един екземпляр наведнъж. Например: /,foulinizou/ отнема два пъти, за да бъде заменен - ​​първият път връща /,faulinizou/. Когато стартирам израза отново, той връща /,faulinizau/. Това не е голям проблем, защото с удоволствие изпълнявам израза няколко пъти, при условие че решава проблема ми. И това НАИСТИНА решава проблема ми! Благодаря ти много! - person Niamh Doyle; 04.11.2011
comment
Добавих още една възможност, за която се страхувам, че няма да работи във вашия случай, поради липса на поддръжка на функции на определени езици и реализации на регулярни изрази - person Code Jockey; 04.11.2011
comment
Благодаря ви много за вашата актуализация. Мисля, че TextWrangler не поддържа променлива дължина, защото създава грешка при търсене, когато се изпълнява актуализираният израз. Грешката гласи: Grep pattern: lookbehind assertion не е с фиксирана дължина. - person Niamh Doyle; 05.11.2011