2017-07-06 13 views
0

私はグループ()[]|とOR演算子によって排他的マッチングを行うための多くの方法を見てきましたJavascriptを正規表現:と行動

で正規表現を勉強しています。

正規表現でのAND動作の達成方法を理解できません。私はいくつかの調査をしましたが、私は必要なものを見つけられませんでした。

ここに例を示します。私は次の文字列を持っています:kata。私は別の文字列と比較したい:steak
steakのすべての文字がkataに含まれている場合は、trueを返すことが目標です。この正規表現[steak]を使用するとtrueを返しますが、実際にはkataには「s」がないのでfalseを返すはずです。

例2 String1 = scriptsjavastring2 = javascript、結果= true(文字列2を文字列1に含まれているため)

例3 String1 = jscriptsstring2 = javascript、結果= false(文字列2が完全に文字列1に含まれていないため)

例4 String1 = rkqodlwstring2 = world結果= true(文字列の世界が最初の文字列にあるため)

普通の式が最良の方法であり、私はstring2をパターンと見なしました。この問題に対する私の解決策は次の通りです

var validate=true; 
var counter = 0; 
str2.split("").map(val => { 
    counter++; 
    var char = new RegExp(val); 

    if (char.test(str1) === false) { validate = false;} else 
    { 
    str1 = str1.slice(0, counter+1) + str1.slice(counter+1,str1.length); 
    console.log(str1); 
    } 

}); 
return validate; 

私は最も効率的だと思います。あなたはこれに対してより良い解決策を持っていますか?

+1

少し混乱して表示されるので、いくつかのペアの例を挙げ、各ペアについて何を期待しているかを書き留めてください。 –

+0

使用する言語を追加できますか?正規表現の解決法は、それを解決する最善の方法ではないでしょう。 –

+0

正規表現の仕事は、 "2つの文字列を比較する"ことではなく、パターンの説明と文字列を一致させることです。あなたはそれが何をしようとしているのか、それを行うための別のツールをよりよく定義する必要があります。 – deceze

答えて

0

以下のプロトタイプ関数は、比較対象の文字列をループします。

そして、それと比較される文字列に&が置き換えられているかどうかを確認します。
そうでない場合は、falseを返します。

String.prototype.ContainsCharactersOf = function(str2) { 
 
    if (this.length < str2.length) return false; 
 
    var str1 = this; 
 
    for (i = 0; i < str2.length; i++) { 
 
    if (str1.indexOf(str2[i])<0) return false; 
 
    str1 = str1.replace(str2[i],""); 
 
    } 
 
    return true; 
 
} 
 

 
//TRUE examples: 
 

 
console.log("scriptsjava".ContainsCharactersOf("javascript")); //same characters 
 
console.log("rkqodlw".ContainsCharactersOf("world")); //has all with extra 
 

 
//FALSE examples : 
 

 
console.log("jscripts".ContainsCharactersOf("javascript")); //smaller, so can't have 'em all 
 
console.log("helooo".ContainsCharactersOf("hello")); //missing a second 'l'

正規表現で "AND" 行動についてタイトルに答えること。
ANDのような正規表現を使用するには、単語の各文字に肯定的な先読みを連鎖させることができます。
F.e. "ステーキ"のすべての文字を含むすべての単語をテキスト内で検索する正規表現:

\b(?=\w*s)(?=\w*t)(?=\w*a)(?=\w*e)(?=\w*k)\w+\b 
+0

これはステーキ、 3番目のようないくつかの例はありません。実際、この場合、それは一致して真を返す。 –

+0

@ L.PierRoberto確かに、それは実際にタイトルへのより多くの答えでした。今私は正規表現を使用しない質問自体に答えるjavacodeを追加しました。 – LukStorms

0

セット比較、特にスーパーセットチェックが必要です。 Setとシンプル:私が見た場合

let s1 = 'javascript'; 
 
let s2 = 'scriptsjava'; 
 

 
Set.prototype.isSuperset = function(subset) { 
 
    for (var elem of subset) { 
 
     if (!this.has(elem)) { 
 
      return false; 
 
     } 
 
    } 
 
    return true; 
 
} 
 

 
console.log(new Set(s1).isSuperset(new Set(s2)));

0

まあ、これは私の第二の答えですが、私は後で前の回答を削除するかもしれない、これはあなたのために有用であると思われます。

良い回答が投稿されていますが、まだ正規表現でAND演算を保持したいと思うので、regexAND答えが必要です。したがって、私はあなたの必要に応じて動作する答えを与えるつもりです。しかし、あなたが私が率直であることを望むなら、私は、あなたの要求に対して、正規表現操作は、私が行きたい最後のオプションのようなものだと言います。ペアごとに

、言うSTR1、とstr2:

今すぐ答えをしています。 str2の各文字がstr1に存在するかどうかを確認する必要があります。

したがって、str2の文字列全体についてそれぞれの文字に対して正の先読みの形でAND演算を行い、これらがすべてstr1に存在するかどうかを確認することができます。 それぞれの見方は次のようになります:(?=。* w)

正規表現のように書かれていると、以下のようにANDとして動作します。

例えば: STR1 = "rkqodlw" STR2 = "世界"

は次のようにSTR2で正規表現を作る:

^(?=.*w)(?=.*o)(?=.*r)(?=.*l)(?=.*d).*$ 

、それはSTR1と

と一致するかどうかを確認します

このように:

function compare(str1,str2) 
 
{ 
 
var regexAnd=str2.split("").join(")(?=.*"); 
 
var regexStr="^"+"(?=.*"+regexAnd+").*$"; 
 
console.log(regexStr); // prints the entire and condition 
 
    
 
var re = new RegExp(regexStr,"gm"); 
 

 
return re.test(str1); 
 

 
} 
 

 
console.log(compare("scriptsjava","javascript")); 
 
console.log(compare("jscripts","javascript")); 
 
console.log(compare("rkqodlw","world"));

+0

@L。 Pier Roberto plzがあなたの質問に答えるかどうかを確認します。 –