7

私は正規表現で良くなっていますが、現在私ができることを超えた何かを思いついたのです。

文字列内に単語が見つかったかどうかをテストするためにテストする(trueまたはfalseを返す)関数を作成したいと思います。しかし、その単語が別の単語の中に見つかった場合、私は正の一致を持ちたくありません。また、複数化をチェックする可能性も盛り込んでいきたいと思います。

これが私が得ると期待する結果のいくつかの例です:

探す単語:「バー」

"検索する文字列"//何として返されるか

"foo bar" // true

「foobar」// true

「foobar!」// true('bar'の前後の他の句読点でもtrueになります)

「fooバー」// true

「fooはむき出しです。」// true(baresはbarsとは異なる意味を持ちますが、 "es"で複数形になる単語をチェックする必要があり、どの単語を知るために正規表現を作成することは期待できないため、trueを返すことで問題ありません。 「s」で複数形にし、どちらを「es」にするか)

「私の名前はバートシンプソンです」//false(バーは実際には「バート」の一部です)

「バートシンプソンはバーに行きました。」// true

javascript/jqueryを使用して一致を確認します

助けてくれてありがとう!

4

3 に答える 3

4
var rgx = new RegExp('\\b' + word + '(?:es|s)?\\b');
rgx.test(string);

これtrueにより、リクエストで指定したすべての文字列が返されます。 \b「単語境界」を表し\Wます。これは、文字列の開始または終了だけでなく、任意の文字 (ピリオドと感嘆符を含む) であると私は信じています。

于 2013-02-13T18:08:24.847 に答える
2

これはすでに回答され、受け入れられていますが、複数形の一致をより適切に行う、少し過剰に設計されたアプローチを提供すると思いました。それ以外は、@ExplosionPills のソリューションとまったく同じロジックを使用します。

(function() {
  var isWord = function(word) { return /^[a-z]+$/i.test(word); },

      exceptions = {
        man:   'men',
        woman: 'women',
        child: 'children',
        mouse: 'mice',
        tooth: 'teeth',
        goose: 'geese',
        foot:  'feet',
        ox:    'oxen'
      },

      pluralise = function(word) {
        word = word.toLowerCase();

        if (word in exceptions) {
          // Exceptions
          return '(?:' + word + '|' + exceptions[word] + ')';

        } else if (word.match(/(?:x|s|[cs]h)$/)) {
          // Sibilants
          return word + '(?:es)?';

        } else if (word.match(/[^f]f$/)) {
          // Non-Geminate Labio-Dental Fricative (-f > -ves / -fs)
          return '(?:' + word + 's?|' + word.replace(/f$/, 'ves') + ')';

        } else if (word.match(/[^aeiou]y$/)) {
          // Close-Front Unround Pure Vowel (-Cy > -Cies)
          return '(?:' + word + '|' + word.replace(/y$/, 'ies') + ')';

        } else if (word.substr(-1) == 'o') {
          // Mid-Back Round Vowel (-o > -oes / -os)
          return word + '(?:e?s)?';

        } else {
          // Otherwise
          return word + 's?';
        }
      };

  String.prototype.containsNoun = function(singularNoun) {
    if (!isWord(singularNoun)) throw new TypeError('Invalid word');
    var check = new RegExp('\\b' + pluralise(singularNoun) + '\\b', 'gi');
    return check.test(this);
  };

  String.prototype.pluralException = function(plural) {
    if (!isWord(this) || !isWord(plural)) throw new TypeError('Invalid exception');

    var singular = this.toLowerCase();
    plural = plural.toLowerCase();

    if (!(singular in exceptions)) {
      exceptions[singular] = plural;
    }
  };
})();

これはネイティブStringオブジェクトを拡張するため、次のように使用します。

'Are there some foos in here?'.containsNoun('foo'); // True

Node.js で行われた簡単な単体テストについては、Gistを参照してください。

于 2013-02-14T11:58:32.163 に答える
1
/ (bar((e)?s)?)[ !?.]/

必要なものによっては、これが機能する場合があります。スペースが重なっているため、文字列 "bars bar" に 2 つのバーが見つかりません。

/ (bar((e)?s)?)(?=[ !?.])/

いずれにせよ、現在すべてのブラウザでサポートされているjs1.5以降、「バーバー」(2つの一致)で動作するはずです。

于 2013-02-13T17:58:32.310 に答える