\G
dizenin başında veya son maçın son karakteri tüketilen nokta ya Eşleşme sınırı, maç olacak.
Karmaşık belirtme işlemi yapmanız gerektiğinde ve ayrıca belirteçlerin geçerli olduğundan emin olmanız özellikle yararlıdır.(Ben dizenin sonunu belirtmek için ~
kullanın) bu jeton içine
input 'some input in quote' more input '\'escaped quote\'' [email protected]_$of_fun ' \' \\ ' crazy'stuff'
:
input~
some input in quote~
more~
input~
'escaped quote'~
[email protected]_$of_fun~
' \ ~
crazy~
stuff~
Örnek problem
bize bu girişi tokenizing örneğini ele alalım Dize, aşağıdakilerin bir karışımından oluşur:
\
ve
'
'un çıkmasına izin veren tek tırnaklı dizgi ve boşluklar korunur. Boş dize tek tırnaklı dizgi kullanılarak belirtilebilir.
- VEYA beyaz olmayan boşluk karakterlerinden oluşan bir diziden oluşan ve
\
veya '
içermeyen, ayrıştırılmamış dize.
- 2 dizilemeyen dize arasındaki boşluk bunları sınırlandıracaktır. Diğer durumları sınırlamak için alan gerekli değildir. Basitlik açısından
, (Eğer gerçek durumda bunu dikkate ihtiyacını) bize girdi yeni satır içermiyor varsayalım. Noktayı göstermeden normal ifadenin karmaşıklığına katkıda bulunur.
tek başına alıntı dize için RAW regex '(?:[^\\']|\\[\\'])*+'
Ve tırnaksız dize için RAW regex Gerçi yukarıdaki regex 2 parça çok fazla önemsemeye gerek yok [^\s'\\]++
olduğunu.
\G
aşağıda çözüm motoru herhangi eşleşme bulmak için başarısız olduğunda, son maçın pozisyonuna dizinin başlangıcından itibaren tüm karakter tüketildiğine dair emin olabiliriz. Karakter atlayamayacağından, dizgenin geri kalanında rastgele şeyler yakalamak yerine, her iki belirtim belirtimi için geçerli bir eşleşme bulunamadığında, motor eşleşmeyi durduracaktır.
inşaatın ilk adımda İnşaat
, bunu birlikte regex koyabilirsiniz: koymak
\G(?:'((?:[^\\']|\\[\\'])*+)'|([^\s'\\]++))
Veya sadece (bu değil regex - sadece daha kolay okunmasını sağlamak için):
\G(Singly_quote_regex|Unquoted_regex)
Bu, yalnızca ilk belirteciyle eşleşeceği zaman, 2. kez eşleşen pts, maç 'some input...
'dan önce boşlukta durur.
Biz sadece müteakip maçında, pozisyonda boşluk son maçında tarafından bıraktığı o tüketilen böylece, 0 veya daha fazla alan yaratmak için biraz eklemek gerekir
:
\G *+(?:'((?:[^\\']|\\[\\'])*+)'|([^\s'\\]++))
Yukarıdaki regex, here görüldüğü gibi jetonları doğru bir şekilde tanımlayacaktır.münavebe soldan sırayla çalışılmıştır yana
\G *+(?:'((?:[^\\']|\\[\\'])*+)'|([^\s'\\]++)|((?s).+$))
: Motor herhangi bir geçerli kodunu almasına başarısız olduğunda o dizenin kalanını döndürmesini sağlayacak şekilde
regex daha da değiştirilebilir -onunca, son seçenek olan ((?s).+$)
, eğer sadece dize geçerli bir tek tırnaklı veya seçilmemiş bir jeton oluşturmazsa eşleşecektir. Bu, hatayı kontrol etmek için kullanılabilir.
birinci yakalama grubu (burada gerçekten ilgili değildir, bu yüzden okuyucular için bir egzersiz olarak bırakın) ihtiyaçları ekstra işleme istenilen metne çevirmek için tek tırnaklı dize içindeki metni içerecektir. İkinci yakalama grubu, tırnaksız dizeyi içerecektir. Ve üçüncü yakalama grubu, giriş dizesinin geçerli olmadığını gösteren bir gösterge olarak işlev görür.
Demo for the final regex
Sonuç
Yukarıdaki örnek simgelileştirme içinde \G
kullanımına bir senaryo gösterilmektedir olup. Karşılaşmamam gereken başka kullanımlar olabilir.
Gerçek bir örnek için bu cevabı inceleyin: http://stackoverflow.com/a/2248130/1606729 – koopajah
@koopajah - teşekkürler. Ne yazık ki, bu uygun bir örnek değil. \ G anchor kullanarak soruyorum; Bağlandığınız örnek, backreference için \ g kullanıyor. –
Tekrar teşekkürler, @koopajah. Yeni örnek gerçekten de \ G kullanıyor, ama bu örnekten hala nasıl ve neden kullanılmalı diye bir şey anlayamıyorum. Gördüğüm tek şey, \ G'nin orada kullanıldığını, ama neden kullanıldığını, diğer durumlarda hangi durumlarda kullanılması gerektiğini, vb. - Bunu anlamıyorum. Daha fazla örnek, lütfen? –