2016-03-23 14 views
0

Şu an saatlerce ağrımın başlamasına neden olan bir regexp sorunuyla karşı karşıyayım. Belirli bir SQL sorgusunda her ifade = değer çiftini döndürecek bir regexp oluşturmaya çalışıyorum. Örneğin:Her bir ifadeyi döndürür Verilen dize için değer çifti

  • (YEAR(created) = ? OR YEAR(created) = ?) verilen iki grupları YEAR(created) = ? ve YEAR(created) = ? istiyorum.
  • Bir grup DATE_FORMAT(col, "%d-%m") = ?
  • vb

ben çok yakın olduğumu düşünüyorum istiyorum DATE_FORMAT(col, "%d-%m") = ? verilen: https://regex101.com/r/mX7sO8/1. Tüm örnekler bana iyi bakıyor, örnek olarak doğru bir şekilde çalışmam için bir örnek veremiyorum (tek bir grup değil, iki grup istiyorum).

Burada birisi bana doğru yönde işaret edebilir mi?

+0

Eşleşen gruplar için kuralınız nedir? –

+0

Bize söyler misiniz ** neden ** bunu yapmanız gerekir (yani daha iyi anlıyoruz ** ne yapmaya çalışıyorsun)? –

+0

İfadeniz '(? :(?: )) ile başlar. Elbette bu yakalamayan grupları içmeye hiç gerek yok mu? Bu karışıklık ekler. –

cevap

1

İlk regex altında

[`\w]+(?:\([^\(]+\))?\s*=\s*\? 

Regex açıklama deneyin ardından = ve ?

ardından herhangi karakterleri içeren opsiyonel parantez ardından alfabeler için muayene:

[`\w]+   any character of: '`', word characters (a-z, A-Z, 0-9, _) (1 or more times) 
    (?:   group, but do not capture (optional): 
    \(    '(' 
    [^\(]+    any character except: '\(' (1 or more times) 
    \)    ')' 
)?    end of grouping 
    \s*   whitespace (\n, \r, \t, \f, and " ") (0 or more times) 
    =    '=' 
    \s*   whitespace (\n, \r, \t, \f, and " ") (0 or more times) 
    \?    '?' 

DEMO

+0

Herhangi bir test durumu başarısız olursa, lütfen değiştirebiliriz. – Braj

+0

Bu, yakalamayan grubunuzda bir '' '' kapanış belirtmediğiniz için çok sayıda yabancı karakterle eşleşiyor gibi görünüyor. – glcheetham

+0

Düzenli ifadeyi biraz güncelledi: '(?: \ W + | \' \ w + \ ') (?: \ ([^ \ (] +)? \ S * = \ s * \?'. Şimdi de eşleşiyor \ 'foo \' =? 'sorgular. Teşekkürler! – Bjorn

0

Ben senin test durumları maç gibi görünüyor yazdım (Ve ben de test durumlarda değil, geçerli SQL maç yapmaya çalıştık) Şunu kıralım

[`\w"]+(\([\w\s,"%-]+\))?\s?=\s?\? 

https://regex101.com/r/lF9hZ4/1

gerçekten hızlı

[`\w"]+ 

biri veya herhangi bir mektup daha

, ters tırnak (`) veya tırnak işareti (")

(\([\w\s,"%-]+\))? 
aşağı

İsteğe bağlı bir grup tarafından izlenir: isteğe bağlı parantez \(, ardından bir veya daha fazla harf, boşluk karakteri, virgül (,), yüzde işareti (%) veya hipen (-) [\w\s,"%-]+, ardından başka bir isteğe bağlı parantez \) izler. Bir eşittir (=) Ardından

\s?=\s? 

isteğe boşluk çevrili işareti sen yapıyorduk sorun \w+\(.+\) yılında .+ çok fazla uyan olmasıydı soru işareti

+0

Yeniden kullanılabilirliği en üst düzeye çıkarmak istiyorum. Bu yüzden, yerine bir '. +' yapmayı tercih ediyorum [\ w \ s, "% - * + 'parantez arasında herhangi bir düşünce var mı? – Bjorn

+0

Eğer'. + 'yaparsanız, SQL sorgusu için * herhangi bir *, birşeyler *, hatta geçersiz karakterler ile eşleşir.Kullanılacak olanı sınırlamak için karakter kümesini açıkça belirtmeye karar verdim, ancak IHMO farkın o kadar değil Zaten SQL'e aklına yazı yazıyorsanız – glcheetham

0

Ardından

\? 

. Bunu görmenin hilesi, ilk grubu yakalamak için ?:'u kaldırmaktır, böylece regex101, YEAR(created) = ? OR YEAR(created)'u yakaladığını size gösterebilir (.+, created) = ? OR YEAR(created'a karşılık gelir). Çözelti, .+'dan sonra açgözlülük yerine tembelleştiği için bir ? eklemektir.

Çözümünüz oldukça karmaşıktır ve özellikle başlangıçta çok fazla özel durumla ilgilenir. Belki de OR gibi operatörlere ayrılmanız daha iyi olur mu?

İlgili konular