文字列の開始文字と終了文字を同じ母音に一致させようとしています。私の正規表現はほとんどのシナリオで機能していますが、他のシナリオでは失敗します:
var re = /([aeiou]).*\1/;
re.test(str);
サンプル入力:
abcde
、出力-false(有効)abcda
、出力-true(有効)aabcdaa
、出力-true(有効)aeqwae
、出力-true(無効)ouqweru
、出力-true(無効)文字列にアンカーを追加する必要があります。
あなたが持っているとき、例えば:
aeqwae
出力は真であると言いますが、a
はe
と同じではないため無効です。正規表現は、前の文字(e
の前)と一致するだけで、a
です。したがって、一致は有効です。だから、あなたはこれを得る:
[aeqwa]e
括弧で囲まれた文字列は実際の一致であり、true
を返す理由です。
正規表現をこれに変更する場合:
/^([aeiou]).*\1$/
^
を追加することにより、一致の開始点を指定しますmustが文字列の開始点になり、$
を追加することにより、一致の終了点を指定します- mustは文字列の終わりです。このように、一致する場合、文字列全体が一致する必要があります。つまり、aeqwae
は一致しなくなります。
正規表現をテストするための優れたツールは Regex101 です。試してみる!
注:入力によっては、グローバル(g)または複数行(m)フラグを設定する必要がある場合があります。グローバルフラグは、最初の一致の後に正規表現が戻るのを防ぎます。複数行のフラグは、^
と$
をline(文字列ではなく)の開始と終了に一致させます。入力でテストするときに、両方を使用しました。
私が楽しみのために書いた@Hristiyan Dodovの別のバージョンの答え。
regex = /^(a|e|i|o|u).*\1$/
const strings = ['abcde', 'abcda', 'aabcdaa', 'aeqwae', 'ouqweru']
strings.forEach((e)=>{
const result = regex.test(e)
console.log(e, result)
})
/^([aeiou])[a-z]\1$/
アルファベット文字をキャッチするためのほんの少しの改善。