1

フルネームを指定すると、姓と名を取得する正規表現があります。「Jr.」などのサフィックスを除外する必要があります。

(.+)\s(.+(?!\sJr\.))

しかし、文字列に対してこの正規表現を適用するとLarry Farry Barry Jones Jr.、一致が得られます。

  1.    Larry Farry Barry Jones
  2.    Jr.

私の否定的な先読みが「ジュニア」を無視できないのはなぜですか。フルネームを解析するとき?マッチ #2 に「Jones」を含めたい。

4

3 に答える 3

1

コメントが言及しているように、.*ほとんどの文字列に一致するのは最初のものです。ここでは、先読みの使用は正しいようです。その値を返したくなく、それ以上の一致に含める必要がないからです。

以下は、すべての単語を分割しますが、「Jr.」は返しません。したがって、最初と最後の結果を取得できます。

(\w+\s)+?(?!\sJr\.)

Ruby RegExp の練習にはRubularをお勧めします。

于 2012-09-26T06:43:09.833 に答える
1

その理由は、文字列が.+最後まで一致し、正規表現の先読みを行うためです。「Jr.」はありません。以下(すでに最後にいるため)==>パーフェクト、一致!!!

しかし、それはあなたのパターンが間違っているからです。これはより良いでしょう:

\S+(?:\s(?!Jr\.)\S+)*

ここでRegexrを参照してください

意味:

\S+一連の少なくとも 1 つの非空白文字に一致します。

(?:\s(?!Jr\.)\S+)*非キャプチャ グループ: 空白に一致し、それが「Jr.」でない場合は、次の一連の非空白文字に一致します。この完全なグループは、0 回以上繰り返すことができます。

于 2012-09-26T07:00:02.500 に答える
1

単一の正規表現でやろうとするよりも、次のコードの方が保守しやすいと思います。

full_name = "Larry Farry Barry Jones Jr."
name_parts = full_name.split - ["Jr."]
first_name, last_name = name_parts[0], name_parts[-1]
于 2012-09-26T06:30:44.843 に答える