2

「*test」、「*love」、「*anything」などの *xxx パターンに一致させようとしています (ハッシュタグなど)

私は基本的に試しました:

"*aaa *eee *rrr *ttt".match(/(\s|^)(\*[a-z0-9]{3,150})(\s|$)/img)

奇数の論理一致のみを返します: "*aaa " および "*rrr "

一致するとき、エンジンは一致する数字全体を「使用済み」として「マーク」し、次のブロックへのテストから削除されると思います。したがって、「何もない」桁は何でしょうか。開始の「^」が存在せず、2 番目の一致の前には何もないためです。

誰かがそれを修正する考えを持っていますか?

4

5 に答える 5

2

matchここでの仕事に適したツールではありません。exec各項目には追加の解析またはトリミングが必要になるため、最初から while ループを使用する方がよいでしょう。

var match,
    tags = [],
    str = "*aaa *eee *rrr *ttt",
    reg = /(?:\s|^)(\*[a-z0-9]{3,150})\b/gim;

while (match = reg.exec(str))
    tags.push(match[1]);

console.log(tags)
//-> ["*aaa", "*eee", "*rrr", "*ttt"]

正規表現では、\bは単語境界を(?:\s|^)意味し、一致するがキャプチャしないことを意味することに注意してください\sor ^。後者は、それmatch[1]が常にタグになることを保証します。

于 2013-06-21T15:50:12.787 に答える
1

問題は、スペースが前の一致によって消費され、現在の一致に使用できないことです。

(?=\s|$)の代わりに先読み - を使用できます(\s|$)。試す:

(\s|^)(\*[a-z0-9]{3,150})(?=\s|$)

先読みの詳細については、こちらを参照してください。

テスト

ただし、この場合、スペースに[a-z0-9]一致しないため、次のスペースのチェックを完全に削除できます。これに続いて、別のオプションは次のように変更します: (これが要件に適合する場合)

(\s|^)(\*[^\s]{3,150})

[^\s]空白ではないことを意味します。

于 2013-06-21T15:35:50.033 に答える
1

正規表現を次のように変更してみてください/(\*[a-z0-9]{3,150})/img

実際に見てみましょう: http://regexr.com?35ae3

編集: @AndyE の提案に従って、正規表現はhttp://regexr.com?35aec/(?:\s+|^)(\*[a-z0-9]{3,150})/imgのように記述できます。

于 2013-06-21T15:34:04.900 に答える