2

次のように、音声表記のスラッシュの間の音声記号を置き換えたい:

/anycharacter*ou*anycharacter/

/anycharacter*au*anycharacter/

つまり、すべての場合において、2 つの音声スラッシュの間の「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" は、任意の文字、1 つ以上の文字、または文字なしにすることができます。例: /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 

注:通常のスラッシュが「vaur」に置き換えられる前の「vour」は私の目的ではありません。

上記の問題を解決する方法を教えていただけませんか?どうもありがとう。

4

1 に答える 1

7

ニーズを満たす最も単純な一致式 (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た音声表現で複数回発生する可能性がある場合/、上記の正規表現を複数回実行する必要があります。ワンススルー実行の場合、言語またはツールは、可変長の先読みと後読み (総称してルックアラウンド) の両方をサポートする必要があります。

私の知る限り、これは Microsoft の .Net Regex と、JGSoft の正規表現の "フレーバー" (EditPad Pro や RegexBuddy などのツール) にすぎません。POSIX (UNIX grep が必要) はどのような種類のルックアラウンドもサポートしておらず、Python (私はTextWranglerが使用していると思います) は可変長のルックアラウンドをサポートしていません。可変長ルックアラウンドなしでは不可能だと思います。

可変長ルックアラウンドを必要とし、必要なことを行う式は次のようになります。

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

...そして、置換される文字のみを一致させる (したがって置換する) ため、置換式も同様に変更する必要があります。

au

のみに一致することを除いて、ほとんど同じように機能しou、チェック (ゼロ幅アサーションと呼ばれる) を実行して、直前に aと任意の数の特定の文字があり、直後に任意の数の特定の文字が続くことを確認/します。次に/

于 2011-11-04T15:30:29.590 に答える