Regex Son oluşum?


122


İhtiyacım olan son ters eğik çizgiden sonraki son kısmı yakalamaya çalışıyorum \Web_ERP_Assistant(ile \)

Benim fikrim şuydu:

C:\Projects\Ensure_Solution\Assistance\App_WebReferences\Web_ERP_WebService\Web_ERP_Assistant


\\.+?(?!\\)      //  I know there is something with negative look -ahead `(?!\\)`

Ama bulamıyorum.

[Regexer Demo]


2
Sorunuzun normal ifadelerle ilgili olduğunu anlıyorum, ancak burada kullanılacak en iyi aracın bu olduğundan emin misiniz? Çoğu standart kitaplık, belirli bir dizindeki son yol adını alacak bir yönteme sahip olacaktır. Bu ayrıca belirli bir işletim sisteminde dizin ayırıcının ne olduğunu da hesaba katar.
Steve Rukuts

@Raskolnikov Buna normal ifadede ihtiyacım var. Pth.getFileNameWithoutExtension öğesini biliyorum. Soru normal ifade olarak etiketlendi
Royi Namir

2
Tamam, yeterince adil, emin olmaya çalışıyorum. O zaman bunu normal ifadelerde daha yetenekli kişilere bırakacağım.
Steve Rukuts

Yanıtlar:


95

Negatif önden bakış çözümünüz örneğin şu şekilde olacaktır:

\\(?:.(?!\\))+$

Regexr'de burada görün


2
(?:Olmayan bir yakalama grubu başlangıcıdır. .Herhangi bir karakter olan bu kontroller bir `` tarafından takip değilse herhangi bir karakter.
stema

Çoklu satır yalnızca gerekli Regexr testi içindir. .Pdf dosyasının anlamını değiştirir $. Standart, satırın sonunda Multiline ile dizenin sonudur. Regexr'deki test metninin birden fazla satırı olduğu için, bu seçeneğe ihtiyacım var.
stema

ya başlangıçta \ işareti olmadan orijinal sorumla aynı isteği istiyorsam?
Royi Namir

2
(?:[^\\/](?!(\\|/)))+$başlangıçtaki eğik çizgiyi kaldırır ve hem ileri hem de geri eğik çizgileri ile baş eder. Ayrıca onlarda bir eğik çizgiler olmadan pathes için tüm dizeyi maçları mesela manual.doc
mrswadge

5
Bir Sertleştirilmiş Açgözlü Token olarak, nokta daima lookahead sonra gelmelidir: (?:(?!\\).)+. ( ref ) Ayrıca, RegExr'deki örneğiniz yol bileşenlerini ayırmak için iki ters eğik çizgi kullanır; yalnızca bir tane olmalı ve normal ifade yalnızca biriyle eşleşmelidir . ( demo )
Alan Moore

62

Benim için çalışan şuydu:

.+(\\.+)$

Çevrimiçi deneyin!

Açıklama:

.+     - any character except newline
(      - create a group
 \\.+   - match a backslash, and any characters after it
)      - end group
$      - this all has to happen at the end of the string

16
Parçaların
Jason Bruce

1
Özellikle son eğik çizgiyle (/) eşleşen bir normal ifade arıyordum. Ters eğik çizgi bir eğik çizgi ile değiştirildiğinde, @stema tarafından kabul edilen yanıtın işi yaptığı ortaya çıkar. Sizinki HER eğik çizgiyi takip eden her şeyle eşleşiyor, ki bu gerçekten aranan çözüm değil. Cevabınıza oy verdim çünkü açıklamanız başarılı oldu, ancak çözümünüz gerçekten işe yaramadı
Chidozie Nnachor

Bu çok daha basit ve genel olarak olumsuz bir bakıştan daha iyidir, bir hatta kesintisiz olduğu sürece neden aşırı karmaşık?
Scott Anderson

42

İleriye olumsuz bakış doğru bir cevaptır, ancak şu şekilde daha net yazılabilir:

(\\)(?!.*\\)

Bu, \ 'nin bir oluşumunu arar ve sonra eşleşmeyen bir kontrolde, herhangi bir sayıda karakter arar ve ardından ondan sonra görmek istemediğiniz karakter gelir. Negatif olduğu için, yalnızca bir eşleşme bulamazsa eşleşir.


4
Bu, yalnızca son ters eğik çizgiyle eşleşir . OP de ondan sonraki her şeyi eşleştirmek ister.
Alan Moore

Çok faydalı, bu daha temiz sürüm, yalnızca ters eğik çizgiyi yakalamasına rağmen, her şeyi tıkırtı. Teşekkür ederim.
Matt Binford

28

Bunu ipin sonuna kadar tutturmayı deneyebilirsiniz, gibi bir şey \\[^\\]*$. Görev için kesinlikle regexp kullanmak zorunda olup olmadığından emin değilim.


2
Bu benim için harika çalıştı. ([^\/]*)$bir Linux kutusunun yolundaki dosya adıyla eşleşir. ^Bu bağlamda imlecin nasıl çalıştığını açıklayabilir misiniz ? Onu sadece dizelerin başlangıcını belirtmek için kullandım.
Brad

@Brad, bu olumsuzluk. Anlam, [^\/]dışındaki herhangi bir karakterle eşleşir /.
Michael Krelin - hacker

9

Peki ya bu normal ifade: \\[^\\]+$


Bunun normal ifadede olması gerektiğini sanmıyorum. Ama cevabımı düzenleyeceğim
SERPRO

err ... Hiç normal ifade olması gerektiğini düşünmüyorum, ama kesinlikle eşleşmenin onu içermesi için, içinde olması gerekir. Önemli değil, sadece gördükten sonra cevabınızda neyin yanlış olabileceğini düşündüm Olumsuz oy verildi ve benim bulduğum şey buydu, ben de yorum yaptım.
Michael Krelin - hacker

@michael, beni yanlış anlamayın Yorumunuzu takdir ediyorum, sadece normal
ifadeye

5

Ters eğik çizgiyi eklemek istemiyorsanız, ancak yalnızca ondan sonraki metni eklemek istiyorsanız, şunu deneyin: ([^\\]+)$veya unix için:([^\/]+)$


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.