RegEx に基づく自動調停ツールを使用しています。2つの名前を一致させたい。例:"John Francis Edward Smith"
と比較し"John Smith"
ます。さらに、名前には誤りが含まれている可能性があるため、最初の単語の最初の 3 文字と最後の単語の最初の 3 文字のみを比較します。したがって、ここでの肯定的な一致は次のようになり"Joh"
ます"Smi"
。式を作成することはできます(^\D{3}).*\s+(?=\S*$)(\D{3}).*$
が、問題は、エンジンが 2 つのグループを作成し、それらに OR 演算子を使用することです。一方、AND が必要なので、両方が正しい必要があります。私はすべてを試しました。助言がありますか?
2 に答える
あなたの質問を正しく理解していると仮定すると、これはうまくいきます
/^(\D{3}).*(\b[^\s]{3})/
^
行頭へのアンカー
(\D{3})
最初のグループ
.*
が貪欲に可能な限り
取得\b
「単語境界」
[^\s]{3}
が空白ではない 3 文字であることを検出 \S{3} も機能すると思います
トリックは、 .*\b が文字列内の最後の単語境界を見つけることです
グループ化を避ける必要がある場合は、次のような簡単なことを試すことができます
\bJoh.*\bSmi
これは、"Joh" と "Smi" を含む文字列に一致しますが、3 文字のシーケンスがそれぞれ単語を開始することに注意してください (したがって、"John ClineSmith" には一致しません)。
編集
特にジョン・スミスを探しているわけではありません。名前の最初の 3 文字と姓の最初の 3 文字を抽出しようとしています。名前と姓の入力に 1 つ以上のミドル ネームが含まれている可能性があります (例: ジョン ロバート ジェームズ スミス)。ただし、2 つのグループ化はできません。結果は 1 つの単語である必要があります (つまり、上の例では「JohSmi」)。
悪いニュースの担い手になって申し訳ありませんが、あなたが求めていることは純粋に正規表現で行うことはできません. 正規表現は、途切れることなく、次々と文字のシーケンスに一致することを意図しています。グループ化を使用して最終一致からサブシーケンスを抽出したり、複数の一致を実行したりできますが、正規表現一致では、最初に一致した文字から最後まで (スキップなしで) 連続したシーケンスが常に返されます。
あなたが求めているのは、一致の最初から3文字、最後から3文字を返す正規表現です。その間の文字はありません。これは壊れたシーケンスであり、私が認識している正規表現エンジンはこれを行うことができません。追加のコード (php またはツールが何であれ) を使用するか、この方法を放棄して別の方法を探す必要があります。
この質問は同じ根拠をカバーしています:キャプチャグループで文字をスキップする正規表現