3

私は次のように一致する方法を理解することができないようです

文字列内/hello/there-my-friend

/最後から最後まですべてをキャプチャする必要があります-

したがって、キャプチャする必要がありthere-myます。

4

5 に答える 5

2

探している正規表現は次のとおりです。

#(?<=/)[^/]+(?=-[^-/]*$)#

すぐに分解しますが、これを行うにはおそらくもっと良い方法があります。

私はこのようなことをするかもしれません:

$str = "/hello/there-my-friend";
$pieces = explode('/', $str);
$afterLastSlash = $pieces[count($pieces)-1];
$dashes = explode('-', $afterLastSlash);
unset($dashes[count($dashes)-1]);
$result = implode('-', $dashes);

ここでのパフォーマンスは線形であることが保証されています(制限要因は$strの長さと$afterLastSlashの長さです。正規表現ははるかに遅くなります(多項式時間と同じくらいですが、見回すと少し厄介になる可能性があります)。 )。

上記のコードは簡単に簡略化できますが、名前を付けるとわかりやすくなります。ここにそれはワンライナーとしてあります:

$result = implode('-', array_slice(explode('-', array_slice(explode('/', $str), -1)), 0, -1));

しかし、グロス、それをしないでください。妥協点を見つけます。

約束どおり、正規表現の内訳は次のとおりです。

#
    (?<=        Look behind an ensure there's a...
        /       Literal forward slash.
    )           Okay, done looking behind.
    [^/]        Match any character that's not a forward slash
    +           ...One ore more times.
    (?=         Now look ahead, and ensure there's...
        -       a hyphen.
        [^-/]   followed by any non-hyphen, non-forward slash character
        *       zero or more times
        $       until the end of the string.
     )          Okay, done looking ahead.
#
于 2013-03-20T22:50:55.287 に答える
1
^".*/([^/-]*)-[^/-]*$

構文は、使用しているREのフレーバーによって異なる場合があります。

于 2013-03-20T22:53:13.693 に答える
1

この短い正規表現を試してください:

/\K\w+-\w+

正規表現エンジンには\Kサポートが必要です

また

(?<=/)\w+-\w+

(よりポータブル)

説明

于 2013-03-20T22:57:00.193 に答える
0

これはあなたの質問に対する正確な答えではありませんが(正規表現ではありません)、C#を使用している場合は、次のように使用できます。

string str = "/hello/there-my-friend";
int lastSlashIndex = str.LastIndexOf('/');
int lastDashIndex = str.LastIndexOf('-');

return str.Substring(lastSlashIndex, lastDashIndex - lastSlashIndex);
于 2013-03-20T23:01:22.567 に答える
0

これはそれを行います:

(?!.*?/).*(?=-)

あなたの言語によっては、あなたは脱出する必要があるかもしれません/

壊す:

1. (?!.*?/) - Negative look ahead. It will start collecting characters after the last `/`
2. .*       - Looks for all characters
3. (?=-)    - Positive look ahead. It means step 2 should only go up to the last `-`

コメント後に編集:結果に/と最後-が含まれなくなりました。

于 2013-03-20T23:04:27.360 に答える