Parantez içinde yer almayan bir kelime maç [kapalı]

5 Cevap php

i parantez içinde yer almayan bazı anahtar kelimelere göre bir dize bölmek için çalışıyorum ...

so, let's say i have the string "i will meet you where we talked (but not where he said)". i want to split the string into 2 pieces. one containing: "i will meet you", the other containing "we talked (but not where he said)". in other words, i want a regex to match the "where" that isn't in parentheses and ignore the one that is.

thank you very much!
all the best

P.S. i dün ilgili bir soru sordu, ama ben her şey yanlış thinked anladı ... şimdi ben doğru soruyu sormak ...

5 Cevap

giriş ne kadar değişken bağlıdır. Eğer (non-parantez-cümle parantez cümle takip) ... o zaman bu formatta olacağı belli iseniz, çok basit olması ve sadece ilk "nerede" için arama yapabilirsiniz.

Eğer giriş beklenen ne olabilir hakkında daha spesifik olabilir misiniz? Birden fazla parantez bölümüne sahip miyim? Bölümler herhangi bir sırada olabilir?

Düzenleme: güvenle giriş geçerli SQL olacağını söyleyebiliriz gibi geliyor. Ben sadece "" tüm örneklerini aramak ve ardından her biri yineleme ve ondan önce açık ve kapanış parantez sayısını saymak olacaktır. Eğer daha önce açık parantez sayısının belirli bir dize ondan önce yakın bir parantez sayısına eşittir "nerede", o aradığınız biridir.

Aşağıdaki regex deneyin:

/(?<!\([^\)]*)where/

(?<!...) eşleşen dize (where) \( karakter herhangi sayısına göre şu açık bir paren öncesinde gerektiğini iddia olumsuz Geriye bakan olduğunu yakın bir paren değil [^\)]*.

Eğer "nerede" ilgi her zaman birinci ve bunun olacağını biliyorum eğer tek "" ilgi, o zaman bu iş olacak olacak:

$array=explode('where',$string,2);

Bu şekilde geri Regexes özel sorunu çözemez traditioal 60'lı yıllarda kanıtlandı. Neyse ki birçok yeni özellik yılda eklenen edilmiştir. İhtiyacınız özelliği "dengeleme grupları" olarak adlandırılan ve bir sayaç bir tür bir Regex içinde kullanılmak üzere izin verir.

İşte senin sorunun basit bir çözümdür:

^
(?'BeforeWhere'
  ((?'Open'\()|(?'Close-Open'\))|[^()])*  # count balanced parens
  (?(Open)^|)  # make sure parens actually balanced
)
(?'Where'\ where\ )
(?'AfterWhere'
  ((?'Open'\()|(?'Close-Open'\))|[^()])*  # count balanced parens
  (?(Open)^|)  # make sure parens actually balanced
)
$

Bu AfterWhere grupları olarak adlandırılır ve BeforeWhere, neden olur. Eğer parantez dışında birden 'Nerede' örneklerini bulmak istiyorsanız size bir ('?' (Önce ve a) son $ hemen önce ekleyebilirsiniz

Bu regex tek zor kısmı emin Pars aslında dengeli edilir yapıyor. Açık hala tanımlı ise o satır, Pars dengesiz yüzden elbette başarısız olan ^ maç. Aksi takdirde hiçbir şey maç ve maç devam eder.

i finnally got it solved with Brian Schroth solution... i made a php function that return every main part of a sql select statement (SELECT, FROM, JOINS, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT) including any number of subqueries contained in that part... if anyone wants this function, i'll post it...

Size tüm çok teşekkür ederim!