1

別のスレッドと非常によく似たこのスレッドを開いていますが、問題がわかりません。オプションの一意のスペースをセパレーターとして英数字の文字列を許可する入力フィールドがあり、次にオプションの他の英数字の文字列など...私はこの正規表現を見つけます:

^([0-9a-zA-z]+ ?)*$

できます !しかし、長い文に 2 つの連続したスペースがあり、それらの 2 つのスペースが文の遠くにあるとすぐに、パフォーマンスは非常に悪くなります。以下の例では、文頭に 2 つのスペースを入れると、結果は 0.5 秒で OK になります。ただし、遠くにあると10秒以上続きます。

dzdff5464zdiophjazdioj ttttttttt zoddzdffdziophjazdioj ttttttttt zoddzdffdzdff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zo999 ddzdfff ttttt zoddzdfff ttttt zoddzdff

2 つのスペースは . の後にあり999ます。この正規表現を改善するためのアイデアや提案はありますか?

感謝と敬意

PF

ps: 2 つのスペースではなく、文字列の遠くに無効な文字を入力するとすぐに問題を確認できます。

編集: 別の例: 12345678901234567890' ==> 20 文字。+ 1 無効な文字。=> 結果は即時 5 つの有効な文字を追加します。正規表現を実行するのに 5 秒かかります。1234567890123456789012345'

4

2 に答える 2

1

式を次のように変更することをお勧めします。

(?i)^[0-9a-z]+(?:\s[0-9a-z]+)*$

ここに画像の説明を入力

これは、単一のスペースで区切られたすべての英数字に一致するという点で機能的に似ています。主な違いは、最初の単語チェックを式の前に移動してから、残りのスペースで区切られた単語に対して非キャプチャ グループを作成したこと(?:です。)

非キャプチャ グループ(?:...キャプチャ グループ)よりも高速(です ...)正規表現エンジンは一致した値を保持する必要がないためです。また、繰り返し単語の単語グループの前にスペース\sを移動することで、エンジンはグループの最初の文字が文字クラスに含まれていることを検証する必要がなくなります。

また、文字クラスにタイプミスがあり[0-9a-zA-z]、最後zはおそらく大文字である必要があります。このA-z形式では、奇妙な予期しない結果が生じる可能性があります。私の式では(?i)、正規表現エンジンを強制的に大文字と小文字を区別しないモードに移行させるために先頭に a を追加し、文字クラスを に落としました[0-9a-z]

私のテストでは^([0-9a-z]+ ?)*$、サンプル テキストの末尾に 2 つの余分なスペースがある式を処理するのに約 0.03 秒かかることがわかりました。私の推奨する式は、約 0.000022 秒で同じテストを完了します。うわー、それは素晴らしいデルタです。

于 2013-06-20T19:46:43.550 に答える
0

\wこれは( word class )を使用したより単純な正規表現です。

^([\w]+(\s*))$

テスト

JavaSript では瞬時に実行されます

var input = "dzdff5464zdiophjazdioj ttttttttt zoddzdffdziophjazdioj ttttttttt  zoddzdffdzdff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt  zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt  zoddzdfff ttttt zo999  ddzdfff ttttt zoddzdfff ttttt zoddzdff";

var re = /([\w]+(\s*))/g;

console.log(input.replace(re, "boo"));
于 2013-06-20T15:56:55.197 に答える