2016-10-27 1 views
-2

文字列の最初の部分(Mr.またはMs. - )を置き換える正規表現が必要です。 「氏の名前」または「氏の名前」と同等のもの「Mr. some name」は「Mister some name」と「Miss some name」になります。私はそのようなケースごとに別々にそれを行うことができます:氏と夫人の代用の正規表現

function fn(str) { 
    if (/^Mr./.test(str)) { 
    return str.replace(/^Mr./, "Mister"); 
    } 
    else if (/^Ms./.test(str)) { 
    return str.replace(/^Ms./, "Miss"); 
    } 
} 

console.log(fn("Ms. Name")) // will output "Miss Name" 

しかし、私はそれが "1つの文字列"ソリューションを持っている必要があると感じています。

+1

Msとミスとの意味的な違いがありhttp://www.softschools.com/difference/ms_vs_miss_vs_mrs。/8/ – spender

+1

'/^Mr. /'も "Mrx"と一致します... – deceze

+1

いいえ、あなたが探しているものと置き換えているものの両方が異なるため、実際にはありません。 –

答えて

1

"^Mr\."を正規表現として使用してください。

.すべての文字をエスケープしないでください。

str = str.replace("^Mr\.", "Mister").replace("^Ms\.", "Miss"); 
+0

"Ms."を置き換えないでください。 「ミス」と一緒に。彼らは同等ではありません。これは、このソリューションに対するノックではない、私はちょうど後で視聴者がそれが有効な英語だと思うことを望まない。 – LinuxDisciple

+0

「夫人」じゃない?しかし、ネイティブではありません。 – Uriel

+0

OPの質問に対する彼のコメントの@ spenderのリンクを参照してください。 "ミズ。"意図的にあいまいであり、省略形でもない(どちらも夫人ではない)。アメリカ英語(そして近代英語 - 英語)で使われている "Ms."略語ではありません。ウィキペディアには "Ms."に関する良い記事があります。 – LinuxDisciple

4

これはやる、単一の操作でそれを行うには:

str.replace(/^M(r|s)\./, function(m) { 
    return { 
     'Mr.': 'Mister', 
     'Ms.': 'Miss' 
    }[m]; 
}); 
  1. 両方の可能な場合にマッチする正規表現を使用して、1ライン分の


    そして、 、M(r|s)\.

  2. 一致した値を特定して結果に変換するコールバック関数を使用します。ここでは単純なキー値オブジェクトを使用します。

この簡単なケースでは簡単ですが、このアプローチは非常に複雑で読みにくいものになります。個々の置換を行うことは、より健康的な選択肢かもしれません。

+2

@PeterLeger次回は片手でそれを変更するのではなく、答えにコメントしてください。あなたの編集が間違っているので、それはおそらくその後の編集の流れを引き起こしました。 –

+0

@FélixGagnon-Grenier:そうです!そのために残念。元に戻すためにもう一度編集したいと思います。次回はコメントします。ヒントありがとうございました! – Sun

+0

@deceze、[about this solution](http://stackoverflow.com/a/40292933/2545680)はどうですか? –

1

または正規表現なし:

var transform = str => str.split(" ").map((word, index) => { 
    if (index === 0 && word === "Mr") return "Mister"; 
    if (index === 0 && word === "Ms") return "Miss"; 
    return word; 
}).join(" "); 
+0

なぜこの激怒?少なくとももう少し説明してください!!! –

+0

"文字列の最初の部分(Mr.またはMs. - )を置き換える正規表現が必要です。この種の仕様は十分にはっきりしていないのですか? –

+0

そして、あなたはdesingingソリューションよりも、downvoteと愚かなテストの方がはるかに才能があります。私はちょうど正規表現なしのソリューションを提供しています。そして、この解決策はMrやMsのどちらでもない文字列で完璧に動作します –

2

正規表現はここに適合しません。

Regexソリューションでは、すべての特定の接頭辞をパターン化されていない展開された値に再一致させる必要があります。

これは、このソリューションを1つ以上の正規表現に分割するために、プレフィックスを2回(decezeの解)一致させるか、.replace()(Uriel Eliの解)を冗長呼び出しする必要があることを意味します。

これは無駄で複雑すぎます。 String.prototype.substring()は、問題を適切にパターンに一般化することができないため、.replace()よりはるかに適しています。

function (name) { 
    return ("Mr." == name.substring(0,3))?"Mister"+name.substring(3):name; 
} 

"Ms."を置き換えないでください。 "ミス"と一緒に。 @ spenderのリンクを確認してください。

+0

_Regexソリューションは、すべての特定のプレフィックスをパターン化されていない展開された値に再一致させる必要があります。つまり、私たちのプレフィックスを2回一致させる必要があります(decezeの解決策)_ - これについてちょっとお教えください。 –

+0

decezeの解(とあなたのもの)は最初に正規表現を使って一致させなければなりませんでした。そして、一致した値を静的な文字列 'Mr.'と比較しなければなりませんでした(そして、比較。まだ正規表現を使用している間にそれを行うための良い方法はありませんが、それはまだ残酷です。私はUrielのソリューションが正規表現を使用していないと主張します。確かに彼は正規表現を扱うことができる関数を呼び出していますが、パターンマッチングではなく文字列の比較を行うために使っています。さらに、彼は2度やらなければなりませんでした。少なくとも1つの比較がいつも一致しなくなるでしょう。 – LinuxDisciple

+0

あなたのものも比較 '(" Mr. "== name.substring(0,3))?"ミスター "+ name.substring(3):name'、私とあなたの違いは何ですか? –

1

私はあなたにもこの^M((r)|s)\.のような正規表現を使用して、グループの存在に一致するかどうかを確認することができると思う:

"Ms. hello".replace(/^M((r)|s)\./, function($1, $2, $3) { 
    return $3 ? 'Mister' : 'Miss'; 
}) 
// Miss hello 

"Mr. hello".replace(/^M((r)|s)\./, function($1, $2, $3) { 
    return $3 ? 'Mister' : 'Miss'; 
}) 
// Mister hello 
+0

あなたはコンテンツを必要としないので、 '^((Mr)| Ms)\。'(または '^ M((r)| s) 3番目のキャプチャグループのまた、正規表現の 'g'は余分なものです。これは正規表現に1行に2回以上マッチするように指示するためです。このパターンは最初からしか発生しません。 "Ms"は "Miss"の略語ではないので、 "Dr." "(博士号取得者:"医師 ";})'(または(医師)と一緒に)より短い正規表現: 'str.replace(/ ^((M)| D)r \ ./、function(a、b、c){return c? 'Mister': 'Doctor';})') – LinuxDisciple

+0

@LinuxDisciple 、ありがとう、私の答えを更新しました。一致するグループは常に試合の境界内にありますか? –