1

私は次のような曲のタイトルを持っています:

Cant Stop (feat. Akon)
American Superstar feat Akon
American Superstar ft someone
American Superstar ft. someone

タイトルだけを一致させようとしています、Can'tStop。私はregexrとexpressoの混合物を使用してこの正規表現を思いついた:

(.*)(?:\(?ft|feat)

一致に括弧が含まれているように見えるCan'tStopを除いて、すべてOKに一致します。私は明らかに何か間違ったことをしていますが、私はそれで4時間遊んでいて、それが何であるか理解できません。正しい方向に向けてください。

4

5 に答える 5

2

(?:\(?ft|feat)は "(feat" とは一致しません。\(?は の左側の一部に過ぎないため|です。"(ft" または "feat" には一致しますが、"(feat" には一致しません。"(" の可能性が必要なためです。 「偉業」が省略されているかどうかに関係なく、 の\(?外側を移動する必要があり(?:...)ます。

それを修正した後も、@動靜能量が言及した欲張りの問題が残っています。これは、に追加することで修正でき、?必要.*な最小文字数にのみ一致します。

これにより、すべての例で機能します。 (.*?)\(?(?:ft|feat)

于 2012-11-17T13:38:38.563 に答える
2

これでなんとか直りました。

(.+?)(?:\(|ft|feat)
于 2012-11-17T13:39:08.497 に答える
0

テイラー今、あなたの答えは、角かっこを開いただけで、またはfeatやftがなくても入力と一致します。角かっこを使用しないか、次のように使用することをお勧めします(。+?)(?:\(?(ft | feat ))

于 2012-11-17T18:28:44.533 に答える
0

これは機能します:

(.*?)(?=\(?(ft|feat))

それは他の答え(貪欲と優先順位の問題)で言われたことを要約し、それに加えて前向きな先読みを使用します。

于 2012-11-17T13:47:29.120 に答える
0

これ.*は「グリーディ」と呼ばれるもので、開き括弧と一致します。(後で開始括弧がオプションであると指定したため、このオプション部分は一致しません)。それを除外するには、[^(]*代わりに使用できます。

于 2012-11-17T13:32:49.967 に答える