2017-12-11 41 views
-1

私がしたいのは、2つ以上の文字が最初に出現したものと一致するので、例えばAとFを以下の文字列からハイライトしたいとします:文字列内の各文字の最初の一致を一致させる

"ASDFASDFASDFASDF" 

しかし、唯一の最初Aとだけ最初F

私が試した:

/A{1}F{1}/i 

しかし、喜び...

感謝任意のアイデア...

+4

目的は何ですか?また、なぜ '.indexOf()'のような単純なものを使うことができないのですか? – Tomalak

+0

私は 'indexOf'について同意します。他の方法がない場合は、最初に 'A'を検索するときに'^[^ A] *(A) 'を試すことができます(javascript RegExpを使って可変長のlookbehindがないので)。グループをキャプチャすると、文字列中の出現位置を知ることができます。 – PJProudhon

+0

文字列に** AとFの**の位置で何かしたいのでない限り、単純に 'includes'または' indexOf'が行います。 – gurvinder372

答えて

0

indexOfのような簡単なアプローチがあります。

考え方と同じように、正規表現を使用して最初の出現箇所を検索するのではなく、文字列を逆順にして、最後に出現箇所を見つけるには、negative lookaheadを使用します。

次にreplaceを正規表現で置き換えて、<span>のようなラッパーを追加してから、文字列を再度反転します。

例は、最後に出現のための正規表現:

(shark|trip)(?!.*\1)

([A|F])(?!.*\1)

var str1 = "ASDFASDFASDFASDF"; 
 
str1 = str1 
 
    .split("").reverse().join("") 
 
    .replace(/([A|F])(?!.*\1)/gim, '>naps/<$1>naps<') 
 
    .split("").reverse().join(""); 
 
document.write(str1); 
 

 
document.write("<br>"); 
 

 
var str2 = "I am on a shark fishing trip, a fishing trip for shark I am on."; 
 
str2 = str2 
 
    .split(" ").reverse().join(" ") 
 
    .replace(/(shark|trip)(?!.*\1)/gim, '<span>$1</span>') 
 
    .split(" ").reverse().join(" "); 
 
document.write(str2);
span { 
 
    color: red; 
 
}

0

これは、あなたがしたい試合を与える必要があります:

/^(a).*?(f)/i 
  • ^は文字列
  • の開始時に位置をアサート*。?任意の文字に一致します(行終端文字を除く)
  • *?数量化 - 0から無制限の時間にできるだけ早くマッチし、必要に応じて拡張する(遅延)
+1

'F'が常に' A'の後ろにあるときだけ、ほとんど確実にそうではありません。 – Tomalak

+0

それは動作していないようです:https://regex101.com/r/IxkI5p/4 - それはAからFまでの全てにマッチしますが、私はちょうどAとFを必要とします – JFM

+0

もう一つの例...私はいくつかのスパンタグを囲んで)サメと旅行という言葉。しかし、各単語の最初のインスタンスだけ: – JFM