6

単純な正規表現である必要があることを実行しようとしています。ここで実行したいのは、単語の末尾にsが付いているかどうかに関係なく、単語の単数部分を一致させることだけです。だから私が次の言葉を持っているなら

test
tests

編集:さらなる例、私はこれがそれらの2つだけでなく多くの単語で可能になるようにする必要があります

movie
movies
page
pages
time
times

それらすべてについて、末尾にsがない単語を取得する必要がありますが、末尾にsがない最初のビットを常に取得し、両方の場合に機能する正規表現を見つけることができません。

私は次のことを試しました:

([a-zA-Z]+)([s\b]{0,}) - This returns the full word as the first match in both cases
([a-zA-Z]+?)([s\b]{0,}) - This returns 3 different matching groups for both words
([a-zA-Z]+)([s]?) - This returns the full word as the first match in both cases
([a-zA-Z]+)(s\b) - This works for tests but doesn't match test at all
([a-zA-Z]+)(s\b)? - This returns the full word as the first match in both cases

さまざまな正規表現を試すためにhttp://gskinner.com/RegExr/を使用しています。

編集:これは崇高なテキストスニペット用です。崇高なテキストのスニペットを知らない人にとってはショートカットなので、データベースの名前を入力して「スニペットを実行」をクリックすると、何かに変わります。お気に入り:

$movies= $this->ci->db->get_where("movies", "");
if ($movies->num_rows()) {
    foreach ($movies->result() AS $movie) {

    }
}

必要なのは、「movies」を「movie」に変換し、それをforeachループに自動挿入することだけです。

つまり、テキストを検索して置換することはできず、60〜70語を考慮するだけで済みます(英語のすべての単語ではなく、自分のテーブルに対してのみ実行されます)。

ありがとう!-ティム

4

3 に答える 3

10

解決策を見つけました:

([a-zA-Z]+?)(s\b|\b)

必要に応じて機能し、最初の一致を単語の非複数バージョンとして使用できます。

私がそれを見つけるのを手伝ってくれた@Jahroyに感謝します。解決策が欲しいだけの将来のサーファーのための答えとしてこれを追加しましたが、より詳細な情報についてはJahroyのコメントをチェックしてください。

于 2012-07-10T02:50:51.193 に答える
7

単純な複数形の場合は、次を使用します。

test(?=s| |$)

より複雑な複数形の場合、正規表現の使用に問題があります。たとえば、この正規表現

part(y|i)(?=es | )

「party」または「parti」が返されますが、それをどうするかはわかりません

于 2012-07-10T02:18:11.693 に答える
2

viまたはsedでそれを行う方法は次のとおりです。

s/\([A-Za-z]\)[sS]$/\1

これにより、Sで終わる文字の束が最後の文字以外のすべてに置き換えられます。

ノート:

エスケープ文字(親の前のバックスラッシュ)は、コンテキストによって異なる場合があります。

また:

\1これは最初のパターンを意味します)もコンテキストによって異なる場合があります。

また:

これは、あなたの単語がその行の唯一の単語である場合にのみ機能します。

$テーブル名が行にある多くの単語の1つである場合は、 (行の終わりを表す)を空白または単語の境界を表すワイルドカード(コンテキストによって異なります)に置き換えることができます。

于 2012-07-10T02:12:56.967 に答える