2017-07-28 10 views
1

私はregexesを初めて使用しており、フォームを検証しています。私はString.prototype.matchを使用して、誤った配列応答にフィルターをかけたいと思います。入力は、この形式と一致する必要があり:各識別子は常にfoo-で開始し、その後7桁を有するjavascriptで数字以外の数字を一致させる

"foo-1234567" 

。複数の識別子がある場合、入力は次の形式になります。

"foo-1234567\nfoo-7654321\nfoo-1324536"` 

識別子は改行で区切られます。

foo-の各識別子を入力してから、1文字以上の非数字文字を含む7文字を入力します。入力が、この場合には:["foo-1234A67", "foo-123$5^7"]

"foo-1234567\nfoo-1234A67\nfoo-123$5^7" 

私はこのようなmatchから配列をしたいです。

正規表現は、私が試してみました:

/^foo-\D+$/gmi //nada 
/^foo-(\D){1,7}$/gmi //not even close 
/^foo-\d*\D+\d*$/gmi //good but matches > or < 7 characters 
/^foo-(?=^foo-\d*\D+\d*$)(?=PR-.{7})/gmi //empty string or null 

いつものように、これはコードのゴルフなので、最短コードが勝ちます。

答えて

3

個々の有効な値に一致する正規表現は、簡単です:/^foo-\d{7}$/です。私は気付きましたスペンサーは、プロンプトの後:

let getInvalid = input => input.split("\n").filter(v => !/^foo-\d{7}$/.test(v)) 
 

 
// following has all valid, so outputs empty array: 
 
console.log(getInvalid("foo-1234567\nfoo-7654321\nfoo-1324536")) 
 
// following has some invalid, so outputs them: 
 
console.log(getInvalid("foo-1234567\nfoo-1234A67\nxyz-1234567\nfoo-123$5^7")) 
 
// also works when there is only one value: 
 
console.log(getInvalid("foo-1234567")) 
 
// following has some invalid, so outputs them: 
 
console.log(getInvalid("foo-123$5^7"))

編集:だから私は、その正規表現に一致しない値を捨てるINGを改行にINGの.split()を示唆し、その後.filter()のです"foo-"で始まり、正しい長さの無効な値とのみ一致するように質問されました。すなわち、"foo-123$5^7"は望ましい出力になりますが、無効な値であっても"foo-123""xyz-1234567"は出力されません。文脈では

/^foo-(?!\d{7}).{7}$/ 

:そのような場合、あなたは7桁で値を除外するために否定先読みで正規表現を使用することができます

let getInvalid = input => input.match(/^foo-(?!\d{7}).{7}$/gmi) 
 

 
console.log(getInvalid("foo-1234567\nfoo-1234A67\nfoo-123")) 
 
console.log(getInvalid("foo-1234567\nfoo-11111117\nfoo-1239999")) 
 
console.log(getInvalid("foo-12##567\nxyz-1234A67\nfoo-123$5^7"))

+0

正規表現が間違っていると、正規表現はそれほど単純ではありません。*「私が望む私の持っている各識別子を与えることと一致foo-として、その後7文字1以上の非"*。 –

+0

@SpencerWieczorek - 私の編集はその要件をカバーし、 '.split()。filter()'がないと思うが、元の答えを残して、*すべての*無効な値が出力に含まれるようにする特定の形式に一致する無効な値だけではありません。 – nnnnnn

+0

すごくいいですね。強制的に7桁に一致しないと、OPの要件を満たします。残念ながら私は少し遅れていることが分かりました:P –

1

これはおそらくslickestではありません解決策ですが、あなたは、非桁の文字のための良いo'lファッションのブルートフォース位置のチェックを行うことができます:

/^foo\-(\D......|.\D.....|..\D....|...\D...|....\D..|.....\D.|......\D)$/gm 

「1以上の非数字」の要件を確認するためのより良い方法を見つけたら、アップデートを提供します。

1

\nが常に予想される場合は、このようなことができます。そうでない場合は、無効な識別子につきN + 12文字が取り込まれることがあります.Nは、非数字文字の数です。OPが望んでいるよう

/foo-\d{0,6}\D+\d{0,6}/g

+0

2つの非数字のものでは機能しません – epascarello

関連する問題