2011-12-21 5 views
0

JS内で2つの文字の間で一致する正規表現を見つけようとしていますが、2つの異なるパターンのように見えるため、私はコンマと(、またはコンマとピリオドの文字の間で一致する必要があります(「T.」)JavaScriptで正規表現を使用して2つの文字を一致させる

ここに私が持っているデータです:。

Doe, John (SUP) 
Doe, John T. (SUP) 
Doe, John Smith (SUP) 
Doe, John Smith T. (SUP) 
Doe, John-Smith (SUP) 
Doe, John-Smith T. (SUP) 

は私からちょうど最初の名前と一致する必要がありますそれは、それはこのようになりますので:。

John 
John 
John Smith 
John Smith 
John-Smith 
John-Smith 

ことはここでは、これまで私が持っているコードです:

var nameLinkAdd = nameLink.match(/\,(.*?)\(/g); 

任意の提案のおかげ? !

+0

1行に分割して開始することができます – Ibu

+0

毎回1行にしてください。私はちょうどすべての可能性を与えました(少なくとも私はすべての可能性を考えます)。しかし、それは一度に一つの名前に変わります。 – zen

答えて

0

これは必ずしも後で(SUP)を持っているとは限りません。すなわち、それは(?!.)はあなたがperoid .続く何かをキャプチャしませんを確認します

Doe, John 
Doe, John-Smith 

nameLink.match(/\, *([A-Za-z]+(?:[- ]+[A-Za-z]+\b(?!\.))*)/)' 

に働くだろう。

あなたが前後参照を避ける(このような短い文字列で、私はそうは思いませんが、スピードの問題である可能性があり)、試してみたい場合:

nameLink.match(/\, *([A-Z][a-z]+(?:[- ]+[A-Z][a-z]+)*)/)' 

しかし、これはすべての名前が複数の文字を持っていることを前提としてい1つの大文字と小文字で始まります(合理的なように、大文字の大文字または名前に1文字しか含まれていません)

+0

私はそれが仮定するのは安全だと思います。私は文字の名前が1つあるとか、そんな奇妙なものはないと思う。あなたの正規表現では、カンマとスペースも選択します。 "ジョン"のように。それはあなたのためではありませんでしたか? – zen

+0

*はコンマにマッチしますが、名前自体はグループ1(キャプチャの最初のセット)にあります。 –

0

http://regexpal.com/を使用して正規表現を修正したいと思います。

+0

私はhttp://gskinner.com/RegExr/を使用していますが、これは本当に強固なツールですが、正規表現、特に複雑なものは、私の心がどこにでもあります。 – zen

0

試してみてください。

nameLink.match(/^(\w+(?:\s*\w+)*)\s+(?:\w\.)?\()/); 

何が再びグループ1

normal* (special normal*)*になりたい;)

  • ノーマル= \w
  • 特別= \s*
+0

それでも、上記の「T」を捕まえています。 –

+0

よく見つかる修正中... – fge

関連する問題