2016-03-23 38 views
3
İşte

tarafından alıntı yapılan bir Regex ben işi yapmaya çalışıyorlar edilir Yapmak, ama neredeyse oradayım, bence.Regex çift tırnak

Amacım herhangi bir tek tırnak (') çift tırnak arasına alıntı ediliyor ki (") maç için, yani önündeki çift tırnak garip bir miktar olması gerekir. Ben biliyorum Şimdi sadece tek tırnakların ilk grubuyla eşleşiyor, bu iyi.İlk olarak bu regex'i kullanacağım ve daha sonra yinelemeyi kullanacak ve bazılarını olduğu sürece diğerlerini değiştirmek için tekrar kullanacağım

İşte birkaçı örnekler:

  • "Bu rastgele bir cümledir. :'bir alıntıyla, alıntı '
  • ' Orada burada hiçbir alıntı eşleşmemelidir burada sorun" Anything şu ama şimdi öyle uyumlu olmalıdır'. " 'Ve bu mükemmel: " 'Burada(), diğeri çalışmaz:
  • "Bazı metin" biraz daha metin '
  • bir alıntı olduğunda' o eşleşmelidir bu bir alıntı'" Bunlardan ilki çıkarsa bile: "(')" açgözlü olduğu için işe yarayacaktır (sanırım), ama parantezler arasındakileri kaldırırsanız, diğeri şu anda olmasını istemediğim, şu anda olmasını istemiyorum. aşağıdaki iş olmamalı, ama değildi bu "Bu alıntı yapılan" yapar:
  • Başka bir örnek bu bir olurdu (') 've bu da alıntı yapılan'

Gerçekten kendimi bir uzman olarak görmediğimi unutmayın, birkaç gün önce klasik [a-zA-Z0-9] dışında neredeyse hiçbir şey bilmiyordum ... Herhangi bir yardım gelebilir, temel bir şeyi gözden kaçırmış olabilirim.

Ben burada çalışıyorum:

": https://regex101.com/r/aE7iB8/1

+0

ve bu ön çift tırnak bir tek sayı olması gerekir işte:

Ama işte sen bir demo açıklayabilirim daha bu şekilde daha iyi gösteriyor sanırım (hangi metne izin verildiğine bağlı olarak). Karşı örnekte ne '' "" "\" "''? Regex kullanmak yerine kesinlikle bir yığın kullanmalısınız. – mbomb007

+0

Neyi kastettiğimi anlayamadığımdan eminim, ikincisinin önüne 'tuhaf bir sayı olup olmadığını kontrol edersek eşleşmez miyiz?' –

+0

İç içe aktarılan tırnaklara izin verirseniz, her şey yolundadır. iş için bir araç – mbomb007

cevap

2

İşte, tüm örnekleriniz üzerinde çalışan bir düzenli ifade var - ama biraz daha uzun ve gerçekten okunabilir değil. Umarım java modeli için tüm kaçışları doğru şekilde kullanırım.

(?:(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"|\\G(?<!^))[^'\"]*+(') 

Bu gereksiz backtracking önlemek için son şeklin sonunda ve iyelik değiştiricilerinin maç olacak \G -matcher kullanımını kolaylaştırır.

En baştan başlayalım, [^'\"]*+(') herhangi bir karakterle eşleşiyor, ki bu tek veya çift tırnak değil, tek bir alıntıdır, bir gruba aktarılır. Geçen maçın sonunda

\\G(?<!^) maçlar ((?<!^) Yani biz. şey eşleşti önce ilk vadede \G pozisyonu olduğu gibi biz dize başında bulunmasını önlemek için kullanılır geçen maçta vardı çift tırnak içinde başka tek tırnak varsa sadece deneyin.

(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"

dış çift tırnak ya vardır ya da tek tırnak içermeyen tüm dizileri üzerinden atlamak için kullanılır. ^|\\G(?<!^)[^'\"]*\" maçları ya dize başlangıcı (ilk eşleşme) veya son eşleşmemizin kapanış çift fiyatına kadar eşleşir, eğer içeride tek bir alıntı yoksa [^\"]*+ reklam olmayan bir şeyle eşleşir. ouble fiyat teklifi. (?:"[^\"']*"[^\"]*)*+" daha sonra, tek tırnak işareti için eşlememizi başlatan çift teklife ulaşıncaya kadar tek tırnak ve sekansların dışında çift tırnak içermeyen çift tırnaklarla eşleşir. Ben yanlış bir varsayım olduğunu düşünüyorum https://regex101.com/r/tW5xH4/1

+0

Sadece php'de çalışıyor gibi görünüyor –

1

sen zaten yineleme planlıyorsanız, bu normal bir ifade kullanarak, ilerlerken ilk çift tırnak içindeki her şeyi kapmak için dikkate alacağını (. *?) "

Bu, bir çift tırnak işareti arasındaki herşeyin açgözlü olmayan (ilk) eşleşmesini yapar.

(burada tırnak arasındaki şeyler kapmak için başka yollar bakın: RegEx: Grabbing values between quotation marks)

çift tırnak çiftleri içindeki tüm dizeleri sahip olduktan sonra, dizge içinde herhangi bir tek alıntı maç için önemsiz olacaktır.

+0

Şu an bunu yapmak için çalışıyorum Java, ama yine de yapmak ve/veya bir regex kullanarak bunu yapmak için nasıl biliyorum! –

+1

İyi nokta Burada bir regexin ne için iyi olduğu hakkında bir çok şey vardır çünkü birçok durumda programınızı işleme yapmak için kullanmak daha mantıklıdır Bir regex bir programlama dilini (pratik olarak) değil, (umarız) birçok araçtan biridir bir programlama ile dili. – miken32

İlgili konular