私は次のように一致する方法を理解することができないようです
文字列内/hello/there-my-friend
/
最後から最後まですべてをキャプチャする必要があります-
したがって、キャプチャする必要がありthere-my
ます。
私は次のように一致する方法を理解することができないようです
文字列内/hello/there-my-friend
/
最後から最後まですべてをキャプチャする必要があります-
したがって、キャプチャする必要がありthere-my
ます。
探している正規表現は次のとおりです。
#(?<=/)[^/]+(?=-[^-/]*$)#
すぐに分解しますが、これを行うにはおそらくもっと良い方法があります。
私はこのようなことをするかもしれません:
$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.
#
^".*/([^/-]*)-[^/-]*$
構文は、使用しているREのフレーバーによって異なる場合があります。
この短い正規表現を試してください:
/\K\w+-\w+
正規表現エンジンには\K
サポートが必要です
また
(?<=/)\w+-\w+
(よりポータブル)
\K
に近い(?<=/)
:見回す正規表現の高度なテクニック\w
と同じです、[a-zA-Z0-9_]
それを自由に適応させてくださいこれはあなたの質問に対する正確な答えではありませんが(正規表現ではありません)、C#を使用している場合は、次のように使用できます。
string str = "/hello/there-my-friend";
int lastSlashIndex = str.LastIndexOf('/');
int lastDashIndex = str.LastIndexOf('-');
return str.Substring(lastSlashIndex, lastDashIndex - lastSlashIndex);
これはそれを行います:
(?!.*?/).*(?=-)
あなたの言語によっては、あなたは脱出する必要があるかもしれません/
壊す:
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 `-`
コメント後に編集:結果に/
と最後-
が含まれなくなりました。