2016-07-20 7 views
3

単語の境界で単語の最後の出現を見つける方法はありますか?私は単語のための/\btotal\b/の正規表現の表現を作成しました。この式の最後の出現を見つけるためにsearch()を使うにはどうすればよいですか?助けを前にありがとう!Regex Wordの最後の出現を見つける

答えて

5

あなたは最後の試合を取得するために、負の先読みを使用することができます。

/(\btotal\b)(?!.*\b\1\b)/ 

RegEx Demo 1

RegEx Demo 2

(?!.*\1)を捕獲し、グループ#1すなわちtotal言葉が先に存在しないことを主張する否定先読みであります現在の試合の

+0

私はデモを試してみましたが、あなたのデモとウェブサイト上の一致情報セクションは言う:「いいえマッチグループが抽出されなかった これはあなたのパターンが一致していることを意味しますが何も(キャプチャ(グループ))がなかったことに件名の文字列に一致するものがあります。私はこれが何を意味しているのだろうか?私はあなたのメソッドを試したので質問しますが、regex101.comで一致する文字列の検索機能を使用すると-1になります。 –

+0

私は時々2つの試合をもらえますか?これが最後の合計を見つけたらどうなりますか? –

+0

これは私が2つのマッチを得るところです:https://regex101.com/r/lI0fF7/4 –

7

答えは、ネガティブルックアヘッドと呼ばれる正規表現エンジンの機能にあります。

ネガティブルックアヘッドは、一致するテキストを選択しない関数のグループに属する正規表現のルックアラウンド関数です。否定的な先読みでは、パターンの後に別のパターンが続くことはありません。

のは、我々は、テキストABCのいくつかの繰り返しインスタンスを例文字列があるとしましょう:私たちは、文字列abcの最後のインスタンスを一致させたい場合は

abcaaaaaaaabcbbbbabc111111abc22 

が、その後、私たちは探し否定先読みを使用することができますabcテキストが続き、その後にabcテキストは続きません。正規表現では、次のように書かれます。

abc(?!.*abc) 

この式では、最初のabcが一致するパターンです。サンプルテキストにはabcのインスタンスがたくさんあるので、abcの最後のインスタンス、つまりabcのインスタンスが見つからないabcのインスタンスしか見つからないようにするために、否定的な先取りが必要です。これは、ワイルドカードテキストマッチングを使用して行われます。。*の後に文字列abcが続きます。

<input type="text" id="myText" value="the fox once said hello to the fox in the glen"> 

頂きますJavaScript関数を書きたい場合は、次のより実用的な例では

のJavaScript

例、のは、次のように我々は、Webページ上のHTMLテキスト入力領域を持っているとしましょうテキスト入力領域の値をとり、その意味をユーザに警告として変更するために、関数を書くことができます。この例では、キツネが別のキツネの代わりに鷹にこんにちはと言ったとしよう。この置換を行うには、文字列中の単語foxの最後のインスタンスを置換する必要があります。先読みを使用して同じ正規表現を使用せずに

var myTextValue = document.getElementById('myText').value; 
var strOutText = 'initial: ' + myTextValue + '\r\n'; 
var strModText = strOutText.replace(/fox(?!.*fox)/, 'hawk'); 
strOutText += 'modified: ' +strModText; 
alert(strOutText); 
3

(すなわちグローバルフラグをgを適用した)、オプションは、正規表現と文字列と一致し、最後のマッチを取得するであろう。

var matches = yourString.match(/\btotal\b/g); 
var lastMatch = matches[matches.length-1]; 
+0

実際には 'g'lobal修飾子をオンにしてください。 – revo

+0

@revo確かに、それを忘れてしまった。 – nicael

関連する問題