2017-10-06 19 views
0

単語が一意である単語にマッチさせるためにregexを使用しようとしました。それは機能していないと私は間違って何をやっているか把握することはできません。単語が一意である場合にのみ一致する

私のような、 "ST" の唯一の固有のインスタンスと一致します何かが必要:

  • "1 MARY ST WASHINGTON"

が、これらで失敗:

  • "1 メアリーワシントン"
  • "1 ST MARY ST MT STヘレンズ"
  • "1 MARY RD WE ST WASHINGTON"
  • "1 MARY RD WASHINGTON"

私は、この先読みを考えましたそのような運はありません:

(\bST\b)(?!(\bST\b)) 

私は何が欠けていますか?

答えて

1

確認し、RegExp/\bST\b/g.match()を使用することができます。これはすぐに否定先読みを行い

^(?!(.*\bST\b){2,}).*\bST\b 

をそれは、2またはmoが存在するかどうかをチェックする再出現は\bST\bです。存在しない場合は、パターン内を移動し、少なくとも1つが存在するかどうかをチェックします。

+0

こんにちはスパーク、私はregex101.comであなたの数式を試してきましたが、それは何も一致していません。あなたのアプローチは理にかなっており、私の訓練されていない目には正しいと思われますが、私は見ていないタイプミスがありますか? – sjh

+0

@sjh少なくとも正しい行と一致する限り、https://regex101.com/r/cxVuvk/2は私にとってはうまくいくようです。 – skirtle

+0

はい、すべての行を順番にテストすると、複数行を有効にする必要があります。 – spaark

1

あなたはマッチした文字列の.lengthあなたは、次のパターンを使用することができます

const matches = (str, re = /\bST\b/g, match = str.match(re)) => 
 
        !!match && match.length === 1; 
 

 
const arr = [ 
 
"1 MARY ST WASHINGTON" 
 
, "1 ST MARY ST WASHINGTON" 
 
, "1 ST MARY ST MT ST HELENS" 
 
, "1 MARY RD WEST WASHINGTON" 
 
, "1 MARY RD WASHINGTON" 
 
]; 
 

 
console.log(arr.map(s => matches(s)));

+0

こんにちはguest271314、感謝します。カスケードな一連のインライン.replace(arg、 "replacement")操作で、正規表現をargとして使用したいと考えていました。私はString.uniquereplace()という新しいString関数をプロトタイプ化するというアイディアを持ち歩いていましたが、プロトタイピングを避けるための正真正銘の正規表現だけの式が必要だったようでした。 – sjh

+0

@sjh _ "カスケードな一連のインライン.replace(arg、" replacement ")操作で、正規表現をargとして使用したいと考えていました。"元の質問に.replace() 'が記述されていません。 https://stackoverflow.com/help/how-to-ask、https://stackoeverflow.com/help/mcveを参照してください。文字列の '.replace()'が "失敗"すると期待される結果は何ですか? – guest271314

関連する問題