0

私のパターンは最初の一致の後に停止し、そこにグローバル一致があります。

//When I add [*]* like var pattern=/([^A-z0-9]|^|[*]*)_(\S.*?)_((?!\S)|\W)/g;
//  it works, but when I try to match "1_test1_" and "a_test1_" it matches "_test1_"
//  which I don't want. I know [*]* will match 0 or more instances of literal *
//  but [*]+ won't work due to the first match being "_test1_*"

var pattern=/([^A-z0-9]|^)_(\S.*?)_((?!\S)|\W)/g;

alert("_test1_*_test2_".match(pattern)); //=> _test1_*
    //This should match "_test1_*" first then it should also add to the array with "_test2_"

質問開始

上記(最初のコード ブロック)で "_test1_*,_test2_" を警告し、下(2 番目のコード ブロック)は同じままにしておきます (コメント セクションで示されているように)。

以下に示すテストと完全に一致するため、_test2_ が一致しない理由はわかりません。

質問終了

以下はテストであり、正常に動作します。

alert("_test1_ _test2_".match(pattern)); //=> _test1_, _test2_
alert("_test1_*".match(pattern)); //=> _test1_*
alert("_test2_".match(pattern)); //=> _test2_
alert("*_test2_".match(pattern)); //=> *_test2_
alert("1_test1_".match(pattern)); //=> null
alert("a_test1_".match(pattern)); //=> null
alert("_test1_1".match(pattern)); //=> null
alert("_test1_a".match(pattern)); //=> null
4

3 に答える 3

0

何度も試行錯誤を繰り返した結果、最終的に |\b を追加して答えを見つけました。私の質問に答えてくれてありがとう@Alih Nehpets。

([^A-z0-9]|^|\b)_(\S.*?)_((?!\S)|\W)
于 2012-12-12T22:30:10.533 に答える
0

パターンを変えたほうがいいと思います。これはどう?アンダースコアの前にオプションの記号文字が必要な部分の後に疑問符を付けます。

([^A-z0-9]|^)?_(\S.*?)_((?!\S)|\W)
于 2012-12-12T02:44:39.980 に答える