2016-09-19 6 views
0

ドル記号で始まりスラッシュとドル記号ではないすべての単語に一致させたいと思います。 私はすでにいくつかの正規表現を試しています。ドル記号で始まりスラッシュではないすべての単語を一致させる方法

(?:(?!\\)\$\w+) 

\\(\\?\$\w+)\b 

文字列

$10<i class="">$i01d</i>\$id 

期待される結果

*$10* 

*$i01d* 

ではなく、この

*$id* 

後に予想されるすべての一致する単語を見つける私はワシントン州この私のオブジェクトを置き換えるNT。

+0

です....またはそれは 'でなければなりません\\ $ ' –

+0

なぜ' $ id'ですか?これはブラックリストに載せられた言葉ですか?他のブラックリストに載っている単語はありますか? – wpcarro

+0

$ idはブラックリストに載っていません。しかし、私は\ $と$ idで始まるすべての単語を除外したい。 –

答えて

-1

これは、最初の赤面よりも難しいです。どのように正規表現のように!

あなたはルックの背後には、利用可能な場合は、試すことができます:

/(?<!\\)\$\w+/g 

をこれはJSでは使用できません。 「\」の前にそのような境界がありませんので、残念ながら、あなたは/ Bを経由して、ワード境界に頼ることができない

/\s(\$\w+)/g 

:別の方法として、あなたが存在することがわかっている境界を指定してのようなキャプチャグループを使用することができます。

また、thisは、正規表現をテストするクールなサイトです。単語境界のアンカーについてはthisが説明しています。

+0

@ torazaburo、それは単に必要な調整を提供するほうがずっと便利です。 /(?:^ \ s * | \ s)(\ $ \ w +)/ g – ChiralMichael

-1

負のルックバックアサーションをサポートする言語を使用している場合は、something like thisを使用できます。

(?<!\\)\$\w+ 

これは最もクリーンなアプローチですが、残念ながらすべての言語でサポートされているわけではありません。

これは同様に機能するハッキーの実装です。

(?:(^\$\w+)|[^\\](\$\w+)) 

これは、複数の単語文字が続く行の先頭に

  1. リテラル$のいずれかと一致します。または...

  2. リテラル$これは、の前に、のバックスラッシュを除くすべての文字で始まります。

ここにはworking exampleがあります。

+0

これは '> $ i01d'にマッチする実例です。私はそれがOPが望んでいるとは思わない。 – vlaz

+0

OPは彼が** words **にマッチしたいと言った。 –

+0

キャプチャグループを使用すると、簡単にマッチにアクセスできます。それぞれ、 '\ 1'と' \ 2'です。 – wpcarro

1

1つのオプションは、最初のエスケープシーケンスを排除して、クリーンアップの文字列と一致するようにされています

s = String.raw`$10<i class="">$i01d</i>\$id` 
 

 
found = s.replace(/\\./g, '').match(/\$\w+/g) 
 

 
console.log(found)

+0

私はこの簡素化が好きです。しかし、ここから '$ id'文字列を補間するOPの望みに到達するのは難しいでしょう。 –

0

をここでの大きな問題は、しかし、JavaScriptはない、あなたがnegative lookbehindを必要とするということですそれをサポートしていません。これは、粗、それをエミュレートすることが可能ですが、私は素晴らしいではありませんが、動作しますが、代替手段を提供します:

var input = '$10<i class="">$i01d</i>\\$id'; 
 
var regex = /\b\w+\b\$(?!\\)/g; 
 

 
//sample implementation of a string reversal function. There are better implementations out there 
 
function reverseString(string) { 
 
    return string.split("").reverse().join(""); 
 
} 
 

 
var reverseInput = reverseString(input); 
 

 
var matches = reverseInput 
 
    .match(regex) 
 
    .map(reverseString); 
 

 
console.log(matches);

それはエレガントではありませんが、それは仕事を行います。ここではそれがどのように動作するかです:

のJavaScript サポート先読み式((?>))と否定先読み((?!))を行います。これは負のlookbehindの逆であるため、の逆のの文字列との逆の正規表現を使用して、正確に一致させることができます。すべての試合が逆転するため、元の試合に戻す必要があります。

私は言ったようにエレガントではありません。文字列の操作が多いからです。あなたが望むものを正確に生成します。

See this in action on Regex101

あなたのケースでは、正規表現は

/(?<!\\)\$\b\w+\b/g 
となりますので、 (?<!y)xと表現する "をyそれは が先行していないとして試合X長い" 正規表現の説明通常、

demonstration(JavaScriptではない)

wher e

(?<!\\) //do not match a preceding "\" 
    \$ //match literal "$" 
    \b //word boundary 
    \w+ //one or more word characters 
    \b //second word boundary, hence making the match a word 

入力を逆にすると、すべてのトークンが一致するようになります。さらに、負の後読みがフォームx(?!y)の否定先読みに反転されますので、新しい正規表現は、$ `======>` $ `\`

/\b\w+\b\$(?!\\)/g; 
+0

これはかわいいアイデアで、[この質問](http://stackoverflow.com/questions/641407/javascript-negative-lookbehind-equivalent)などでSOの他の場所で発表されていますが、この場合はより簡単なアプローチ。 –

関連する問題