Care sunt expresiile regulate bune?

Am lucrat timp de 5 ani, în principal, în aplicații de desktop java care accesează baze de date Oracle și nu am folosit niciodată expresii regulate. Acum intru in Stack Overflow si vad multe intrebari despre ei; Simt că am pierdut ceva.

Pentru ce folosiți expresii regulate?

P.S. scuze, Engleza mea nu e prea buna

0
fr hi bn
Nu uitați să citiți Javadocs pentru java.util.regex.Pattern. Este o referință bună. De asemenea, perldoc.perl.org/perlre.html
adăugat autor Adrian Pronk, sursa

9 răspunsuri

O expresie regulată (regex sau regexp pentru scurt) este un șir de text special pentru descrierea unui model de căutare. Vă puteți gândi la expresii regulate ca metacaractere cu steroizi. Probabil sunteți familiarizați cu notații cu metacaractere, cum ar fi *. Txt , pentru a găsi toate fișierele text dintr-un manager de fișiere. Echivalentul regex este . * \. Txt $ .

A great resource for regular expressions: http://www.regular-expressions.info

0
adăugat

Luați în considerare un exemplu în Ruby:

puts "Matched!" unless /\d{3}-\d{4}/.match("555-1234").nil?
puts "Didn't match!" if /\d{3}-\d{4}/.match("Not phone number").nil?

"/ \ D {3} - \ d {4} /" este expresia regulată și, după cum puteți vedea, este o modalitate foarte concisă de a găsi o potrivire într-un șir.

Mai mult, folosind grupuri puteți extrage informații, ca atare:

match = /([^@]*)@(.*)/.match("[email protected]")
name = match[1]
domain = match[2]

Aici, paranteza din expresia obișnuită marchează un grup de captare, astfel încât să puteți vedea exact CARE datele sunt potrivite, astfel încât să puteți efectua o prelucrare ulterioară.

Acesta este doar vârful aisbergului ... există multe lucruri diferite pe care le puteți face într-o expresie regulată care face ca textul de procesare să fie foarte ușor.

0
adăugat

Expresiile regulate (sau Regex) sunt folosite pentru a potrivi modelul în șiruri de caractere. Astfel, puteți scoate toate adresele de e-mail dintr-o bucată de text, deoarece urmează un model specific.

În unele cazuri, expresiile regulate sunt închise în slash-uri și după a doua bară sunt plasate opțiuni cum ar fi insensibilitatea cazului. Iată un bun :)

/(bb|[^b]{2})/i

A vorbit poate citi "2 fi sau nu 2 fi".

Prima parte sunt (paranteze), ele sunt împărțite de țeavă | caracterul care echivalează cu o declarație astfel încât (a | b) să corespundă cu "a" sau "b". Prima jumătate a zonei cu conducte se potrivește cu "bb". Numele din a doua jumătate nu știu, dar sunt parantezele pătrate, ele se potrivesc cu orice este nu "b", de aceea există un simbol al acoperișului (termen tehnic) acolo. Parantezele ciudate se potrivesc cu un număr de lucruri înaintea lor, în acest caz două caractere care nu sunt "b".

După al doilea / este un "i", ceea ce îl face insensibil. Utilizarea tăieturilor de început și sfârșit este specifică mediului, uneori faceți și câteodată nu.

Două legături pe care cred că le veți găsi la îndemână pentru acest lucru sunt

  1. regular-expressions.info
  2. Wikipedia - expresie regulată
0
adăugat
Codurile squiggly referitoare la 2 nu sunt comune, ele sunt curly .
adăugat autor Timo, sursa
Este o descriere bună, dar exemplul din lumea reală a lui Mike este preferabil față de cel de "2b". Ar fi frumos să le combinăm.
adăugat autor Bobby Jack, sursa

Dacă tocmai începi cu expresii regulate, recomand cu inima un instrument ca The Regex Coach:

http://www.weitz.de/regex-coach/

de asemenea, au auzit lucruri bune despre RegexBuddy:

http://www.regexbuddy.com/

0
adăugat

Validating strong passwords:

Aceasta va valida o parolă cu o lungime de 5 până la 10 caractere alfanumerice, cu cel puțin un cuvânt superior, un caractere minuscule și o singură cifră:

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$
0
adăugat

Cea mai tare expresie regulată vreodată :

/^1?$|^(11+?)\1+$/

Testează dacă un număr este prime. Și funcționează!

N.B .: pentru a-l face să funcționeze, este nevoie de puțină configurație; numarul pe care dorim sa il testeaza trebuie sa fie convertit intr-un sir de 1 ? s, apoi apoi putem aplica expresia pentru a testa daca stringul nu conțin un număr primar de 1 ? s:

def is_prime(n)
  str = "1" * n
  return str !~ /^1?$|^(11+?)\1+$/ 
end

Există o explicație detaliată și foarte accesibilă la blogul lui Avinash Meetoo .

0
adăugat
Este inteligent, dar greu de potrivit pentru un începător! :)
adăugat autor Bobby Jack, sursa
@Copas: Este absolut eficient. Ai citit modul și explicația pe care am legat-o?
adăugat autor Konrad Rudolph, sursa
Asta nu pare să funcționeze ... sau am pierdut ceva.
adăugat autor Copas, sursa

Dacă doriți să aflați despre expresiile obișnuite, vă recomandăm să Masterat Expresii regulate . Ea merge tot atât de departe de conceptele de bază, până la a vorbi despre felul în care diferite motoare funcționează dedesubt. Ultimele 4 capitole oferă, de asemenea, un capitol dedicat fiecăruia dintre PHP, .Net, Perl și Java. Am învățat multe din el și încă o folosesc ca referință.

0
adăugat

După cum probabil știți, Oracle are acum expresii regulate: http: / /www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html . Am folosit noua funcționalitate în câteva întrebări, dar nu a fost la fel de util ca în alte contexte. Motivul, cred, este că expresiile regulate sunt cele mai potrivite pentru găsirea datelor structurate îngropate în datele nestructurate.

De exemplu, aș putea folosi un regex pentru a găsi mesaje Oracle care sunt umplute în fișierul jurnal. Nu este posibil să știți unde sunt mesajele - doar cum arată ele. Deci un regex este cea mai bună soluție pentru această problemă. Când lucrați cu o bază de date relațională, datele sunt, de obicei, pre-structurate, astfel încât un regex nu strălucește în acest context.

0
adăugat

Aceste RE sunt specifice pentru Visual Studio și C ++ dar le-am găsit de ajutor uneori:

Găsiți toate aparițiile "rutineName" cu pașii non-impliciți:

routineName \ (: a + \)

Conversely to find all occurrences of "routineName" with only defaults: routineName\(\)

Pentru a găsi cod activat (sau dezactivat) într-o construcție de depanare:

\#if._DEBUG*

Rețineți că acest lucru va prinde toate variantele: ifdef, dacă este definit, ifndef, if! Definit

0
adăugat