Sublime Text 2'de düzenli ifade arama değiştirme


440

Yüce Metin 2 normal ifadeleri ile arama yerine yapmak istiyorum. Bu belgeler oldukça anemik. Özellikle, ben bu metni dönüştürmek gibi bir şey, gruplar üzerinde yerine yapmak istiyorum:

Hello my name is bob

Ve bu arama terimi:

Ne buldun: my name is (\w)+

Şununla değiştir: my name used to be $(1)

Arama terimi gayet iyi çalışıyor ancak regexp grubunu kullanarak bir değiştirme yapmanın bir yolunu bulamıyorum.

Yanıtlar:


584

Genellikle bir geri başvuru, ilk yakalama grubu için (parantez içindeki bir desenin ilk eşleşmesi) ya $1da \1(ters eğik çizgi) şeklindedir ve gerçekten de Sublime her iki sözdizimini de destekler. O zaman dene:

my name used to be \1

veya

my name used to be $1

Ayrıca orijinal yakalama düzeninizin:

my name is (\w)+

yanlıştır ve adın tamamı yerine yalnızca adın son harfini yakalar. İsmin tüm harflerini yakalamak için aşağıdaki kalıbı kullanmalısınız:

my name is (\w+)

15
dışında değil $0mi?
Mart'ta Skylar Saveland

11
Hayır, $ 0 normal bir ifadede geri başvuru olarak kullanılmaz (çünkü \0boş karaktere eşittir ve \0dddkod noktası ddd olan bir karakter için çıkış olarak kullanılır). Ancak, $0Sublime2'de bu sayfaya göre "çıkış işareti" olarak kullanılıyor gibi görünüyor (ancak Sublime2'de tam olarak bir çıkış işaretinin nasıl kullanıldığını çözmek için yeterli örnek bulmakta zorlanıyorum).
Bobulous

3
Çıkış işareti $0, imleci pasaj genişletmesinden çıkışa yerleştirmek için Yüce Metin 2/3'te kullanılır. Parçacıklar hakkında daha fazla bilgi .
jrhorn424

2
0 $ hala Sublime Text 2'deki tüm ifadeyi geri
referanslamak

2
$0tüm normal ifade eşleşmesi; $1ilk yakalama grubudur.
Oletha

103

Bu arada, yukarıdaki soruda:

İçin:

Hello, my name is bob

Bölüm bul:

my name is (\w)+

Yedek parça ile:

my name used to be \1

Dönecekti:

Hello, my name used to be b

Bulma parçasını şu şekilde değiştir:

my name is (\w+)

Ve değiştirme beklediğiniz gibi olacaktır:

Hello, my name used to be bob

(\ W) + "bob" ile eşleşecek olsa da, değiştirmek istediğiniz gruplama değildir.


52

Önemli: ( )Arama dizenizdeki parantezleri kullanın

Önceki cevap doğru olsa da, vurgulanması gereken önemli bir şey var! Tüm arama dizede eşleşen segmentler size kullanılmak istediğiniz yedek dize olmalıdır çevrelediği ( )parantez aksi bu eşleşti segmentler gibi tanımlanmış değişkenlere erişilebilir olmayacak $1, $2ya da \1, \2vb

Örneğin, 'em' yerine 'px' kullanmak istiyoruz, ancak rakam değerlerini koruyoruz:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Yedek dize: margin: $1pxveyamargin: \1px
  • Arama dizesi (CORRECT): margin: ([0-9]*)em// parantez içinde
  • Arama dizesi (INCORRECT): margin: [0-9]*em

DOĞRU DURUM ÖRNEĞİ:margin: ([0-9]*)em Arama dizesini kullanma (parantez ile). İstenen eşleşen segmenti (örn. $1Veya \1) ( )parantez içine alın :

  • Bul: margin: ([0-9]*)em(parantez ile)
  • Değiştir: margin: $1pxveyamargin: \1px
  • Sonuç:
    margin: 10px;
    margin: 2px;

YANLIŞ DURUM ÖRNEĞİ:margin: [0-9]*em Arama dizesini kullanma (parantez olmadan). Aşağıdaki normal ifade deseni istenen çizgilerle eşleşecek, ancak eşleşen segmentler değiştirilen dizede $1veya gibi değişkenler olarak kullanılamayacak \1:

  • Bul: margin: [0-9]*em(parantez olmadan)
  • Değiştir: margin: $1pxveyamargin: \1px
  • Sonuç:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1
Teşekkür ederim, bu cevap gerçekten sorunumu çözen ilginç bir gerçeğe dikkat çekiyor.
Enkk

Gösterdiğiniz için teşekkürler. () İle Sublime 3'te \ 1 ile değiştirebilirim
Jeffrey

47

İşte onaylanmış cevabın görsel bir sunumu.

resim açıklamasını buraya girin


neden bulamıyor $_SESSION[(\w+)? teşekkürler
Toni Michel Caubet

Çünkü $, [, (ve) özel karakterler olduğundan, her özel karakterden ters eğik çizgi ile kaçmalısınız.
zeeawan

25

9'dan fazla yakalama grubu kullanıyorsanız sözdizimini kullanmanız gerektiğini unutmayın ${10}.

$10ya \10ya \{10}edecektir değil çalışırlar.


Teşekkürler! Bu, yakalanan grubun sonuna bir sayı eklemem ve eklemem için yardımcı oldu, örneğin 1, ikinci yakalama grubuna a eklemek için parantez kullanmanız gerekir ${2}1; 21 $, var olmayan 21. yakalama grubunu ifade eder.
Eric

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.