textarea フォームの入力をチェックし、フォームに 999 を超える単語が含まれているかどうかを検出する正規表現が必要です。これは言語に依存しません。つまり、検証のために正規表現を受け入れるフォーム プラグインを使用しています。
5 に答える
誰もがこれを必要以上に難しくしていると思います。「単語」が言語的な意味での単語であるかどうか、本当に気にしますか? それともこれでいいでしょうか?
\S+(?:\s+\S+){999}
もしそうなら、そしてあなたの正規表現フレーバーが所有量指定子をサポートしているなら、私が推奨する実際の正規表現は次のとおりです。
\S++(?:\s++\S++){999}
一致が不可能な場合、これははるかに迅速に失敗します。たとえば、RegexBuddy で正確に 999 語の文字列を照合しようとすると、最初の正規表現が失敗するまでに 21,870 ステップかかりますが、所有格バージョンは 3,996 ステップしかかかりません。所有量指定子がなくても原子群がある場合、これは失敗するまでに 4,008 ステップかかります。
\S+(?>\s+\S+){999}
正規表現を使用してユーザー入力を検証していることを考えると、パフォーマンスはおそらく無関係です。このような状況では、マシンをロックする正規表現を作成するのは非常に簡単なので、私はそれを取り上げました。そして、これは通常、一致するものが見つからない場合に発生します。正規表現をテストするときは、一致するテストと少なくとも同じ数の一致しないテストが必要です。
必要なのは、入力文字列に対する単純な正規表現の一致をテストすることだけです。正規表現パターンを使用
(?:\b\w+(?:\W+|$)){1000}
Unicode サポートを追加する必要がある場合は、パターンを使用してください
(?:\b[\w\p{L}]+(?:[^\w\p{L}]+|$)){1000}
これは、非空白のブロック数をカウントする式です。
^(?>\s*\S+){1000,}\s*$
これは、実際には3語あるのに、次の文字列「Ambassador T'Pel」で2語を数えるため、完全な解決策ではありません。しかし、それは正規表現を非常に単純に保ち、あなたの要件には十分かもしれません。
この正規表現は、バックトラックを最小限に抑えるため、非常に高速です。
@Asadは答えを出すのが恥ずかしがり屋のようだから
(\b\w+\b\s+){1000,}
\b
単語の境界 ( ) の後に、単語の一部となる可能性のある文字が 1 回以上 ( \w+
) 続き、その後に単語の境界と 1 つ以上のスペース文字が続く ( \b\s+
- スペースはタブなどでもかまいません)に一致します。少なくとも 1000 回 ( (...){1000,}
)
先読みを使用します。
^(?=(.*\b\w+\b){1000,})
これは英語中心のソリューションであることに注意してください。他の言語の場合は\w
、「句読点やスペースではない」正規表現などに置き換える必要があります。また、これは単語のアポストロフィには対応していません。