動画の英語字幕があります。
この英語字幕の一部を伏せ字にしてタイピングゲームを作ろうとしています。
str.replace(/[A-Za-z]/g, '_')
で字幕のアルファベット部分を伏せ字にしていたのですが、問題が発生しました。
このキャプションには、「(動作音)」や「[人名]」など会話以外の内容が括弧にくくられて入っています。
この部分は実際に動画で発音していないので、伏せ字にしたくありません。
括弧内以外のアルファベットにヒットする正規表現を教えてください!
入力例
text
1-[TOM] ♪ Taking care to keep my baggage with me ♪ 2-(banging) Huh?
よくない出力
text
1-[___] ♪ ______ ____ __ ____ __ _______ ____ __ ♪ 2-(_______) ___?
期待する出力
text
1-[TOM] ♪ ______ ____ __ ____ __ _______ ____ __ ♪ 2-(banging) ___?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
String.prototype.replace
括弧内以外のアルファベットにヒットする正規表現を教えてください!
正規表現は一度、マッチした文字列には二度とマッチしません。
括弧全体にマッチさせてから、マッチした文字列をそのまま返す置換処理にしてください。
JavaScript
1'use strict'; 2const string = '-[TOM] ♪ Taking care to keep my baggage with me ♪\n-(banging) Huh?'; 3const result = string.replace(/([^)]*)|[[^]]*]|([a-zA-Z])/g, function callbackfn (match, alphabet) { 4 return alphabet ? '_' : match; 5}); 6 7console.log(result); // "-[TOM] ♪ ______ ____ __ ____ __ _______ ____ __ ♪\n-(banging) ___?"
丸投げ質問
コードをください・デバッグしてください等の丸投げの質問
何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。
まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。
この状況で打開策に悩む気持ちは理解できるので、答えを書きましたが、丸投げ質問は推奨されません。
Re: gpioblink さん
投稿2019/01/13 04:57
編集2019/01/13 06:23総合スコア18164
0
一気に1つの正規表現でと言うのは無理です。
split
で、括弧内と括弧外によりわけて、括弧外だけreplace
します。
JavaScript
1str = str.split( /([.*?]|(.*?))/ ).map( 2 function(s){ 3 if(s.match( /([.*?]|(.*?))/ )){ 4 return s; 5 }else{ 6 return s.replace(/[A-Za-z]/g,"_"); 7 } 8 } 9 ).join("");
括弧内を表す正規表現:/([.*?]|(.*?))/
。この正規表現でsplit
する。
split
した配列の各要素について、括弧内ならそのまま、そうでなければreplace
するように、map
で制御する。
最後に配列をjoin
して文字列に戻す。
投稿2019/01/13 02:51
総合スコア84557
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
会話に出現する単語は、以下の条件を満たすものと考えられます。
- 半角アルファベット1文字以上で構成される文字列で、
- かつ、その文字列の直前にある文字は、アルファベットおよび
(
,[
のいずれでもない。 - かつ、その文字列の直後にある文字は、アルファベットおよび
)
,]
のいずれでもない。
この条件に沿って、会話中の単語を、これを囲む左右の文字を含めた正規表現
/[^a-z([][a-z]+[^a-z)]]/i
でマッチさせ、このマッチ部分に含まれるアルファベットを _
に変換するような関数
maskingWordsInSpeech(text)
を作りました。
javascript
1const maskingWordsInSpeech = (text) => { 2 let x = text; 3 while(true) { 4 const y = x.replace(/[^a-z([][a-z]+[^a-z)]]/i, 5 str => str.replace(/[a-z]/ig, '_') 6 ); 7 if (x == y) break; 8 x = y; 9 } 10 return x; 11};
- 動作確認用のサンプル: https://jsfiddle.net/jun68ykt/Lrae1fw3/13/
以上、参考になれば幸いです。
追記
単語の後にくる文字までマッチさせなければ、while
で回したりせずに以下で済みました。
javascript
1const maskingWordsInSpeech = 2 (text) => text.replace(/[^a-z[(][a-z]+/ig, s => s.replace(/[a-z]/ig, '_'));
- 動作確認用のサンプル: https://jsfiddle.net/jun68ykt/Lrae1fw3/25/
投稿2019/01/13 01:24
編集2019/01/13 05:41総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/13 05:14
2019/01/13 05:47
2019/01/13 06:08
2019/01/13 06:20
2019/01/13 06:32
2019/01/13 06:54
2019/01/13 07:01
2019/01/13 07:36
2019/01/13 07:41 編集
2019/01/13 07:49
2019/01/13 11:16
0
正規表現の密林に迷い込むと簡単には抜けられなくなります。
なので、カッコ内の部分だけを記憶しておいて、あとで合体するというのはどうでしょう。
html
1<div id="org"> 2-[TOM] ♪ Taking care to keep my baggage with me ♪<br> 3-(banging) Huh? 4</div> 5<button onclick="change()">change</button> 6<div id="changed"/>
javascript
1function change(){ 2 var str=document.getElementById('org').innerText; 3 var matchedlist=str.match(/[([].*?[)]]/g); 4 str=str.replace(/[([].*?[)]]/g,'*'); 5 str=str.replace(/[A-z]/g,'_'); 6 var strarray=str.split('*'); 7 str=''; 8 for(var i=0,len=strarray.length;i<len;i++){ 9 str+=strarray[i]; 10 if(matchedlist[i]){ 11 str+=matchedlist[i] 12 } 13 } 14 document.getElementById('changed').innerText=str 15}
投稿2019/01/12 19:40
総合スコア336
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/13 05:51
2019/01/13 06:29