3

与えられた文字列:

おかしい-> A_gre$"["at- >見える->素晴らしい/*54[[面白い"->["->[素晴らしい->yolo]->見える]][素晴らしい] ->a2afg34423* /--> yolo "-> ["

配列に分割:

  1. 面白い
  2. A_gre $'[' at
  3. 見える
  4. great / * 54 [[funny'-> ['-> [great-> yolo]-> look]] [great]
  5. a2afg34423 */-
  6. yolo'-> ['

正規表現ソリューション??!?

基本的に、角かっこの周りに引用符がある場合は、角かっこが開閉区切り文字として機能することは避けてください。そうでない場合は、角かっこと閉じかっこの間のテキストが無効になっていることを確認してください。正規表現を使用してこれをどのように達成しますか?

私のパーサーソリューション テスト

var s = "funny -> A_gre$' [ 'at -> looks -> great/\*54[ [funny ' -> [ ' ->"
        + "[great -> yolo] -> looks]][great] -> a2afg34423*/- -> yolo' -> [ '",
    p = 0,
    z = [0],
    q = 0,
    x = s.split('');

//Looking for \" not \'
for(var i = 0; i< x.length; i++){
   var b = x[i],
       c = x[i + 1],
       q = b == "'" ? ++q : q,
       p =  !(q % 2) ? b == '[' ? ++p : b == ']' ? --p : p : p;

   if(b == '-' && c == '>' && !p && !(q % 2))
       z.push(i + 2);
   if(i == x.length - 1){
       z.push(x.length); x = [];
       for(var u = 0; u < z.length; u++)
         z[u + 1] !== undefined ?
              x.push(s.substring(z[u], z[u + 2] !== undefined ?
                      z[u + 1]-2 : z[u + 1]).trim()) : 0;
    }
}

console.log(x)

Ouput:

->>> [
      "funny", 
      "A_gre$' [ 'at", 
      "looks", 
      "great/*54[ [funny ' -> [ ' -> [great -> yolo] -> looks]][great]", 
      "a2afg34423*/-", 
      "yolo' -> [ '"
     ]
4

1 に答える 1

2

このパターンを試してください:

([^\s\[\"]*\[[^\]]+\])\S*|([^\s\[\"]*\"[^\"]+\")\S*|(\w\S*)

regexpalを使用して、一致するものを確認します。それは3つの部分で構成されています。そのうちの1つの説明は次のとおりです。

([^\s\[\"]*\[[^\]]+\])\S*

非スペース、非引用符、および非ブラケット文字を開きブラケットに到達するまで読み取り、次にブラケットの内容を閉じブラケットに到達するまで読み取り、その後に発生する非スペース文字を読み取る式。これは、ブラケットマッチングパーツのより詳細な説明です。

\[         : opening bracket character
[          : regex syntax for starting a set definition
   ^       : It's a negative set, i.e., set of characters which are NOT:
   \]      : closing bracket character
]+         : regex syntax for ending a set definition and the + operator for matching 1 or more occurrences
\]         : closing bracket character

別のセクションは引用符を処理し、別のセクションは角かっこと引用符のない単語に一致します。

次のコードは、一致を確認する方法と、それらを抽出する方法を示しています。

var input ='funny-> A_gre $ "[" at-> look-> great / 54 [[funny "-> ["-> [great-> yolo]-> lookup]] [great]-> a2afg34423 /- -> yolo "-> [" '

var regexp = /([^\s\[\"]*\[[^\]]+\])\S*|([^\s\[\"]*\"[^\"]+\")\S*|(\w\S*)/g;

var result = input.match(regexp)
console.log("Array of matches are:");
console.log(result);

var results = regexp.exec(input);
while(results != null) {
    console.log("index: " + results.index + " found: " + results[0]);
    results = regexp.exec(input);
} 

これはここでライブで見ることができます:http://jsfiddle.net/LXqch/1/

于 2013-02-27T05:40:24.857 に答える