Reguliari išraiška atitinka visiškai kvalifikuotus klasės pavadinimus

Koks yra geriausias būdas suderinti visą „Java“ klasės pavadinimą tekste?

Pavyzdžiai: java.> , java.util.ArrayList , org.hibernate.Hibernate .

31
05 марта '11 в 20:09 2011-03-05 20:09 Chun ping Wang yra nustatytas kovo 05 '11, 20:09 2011-03-05 20:09
@ 8 atsakymai

Visiškai kvalifikuotas „Java“ klasės pavadinimas (pvz., „N“) turi struktūrą

 NNNN 

„N“ dalis turi būti „Java“ identifikatorius. „Java“ identifikatoriai negali prasidėti skaičiumi, bet po pradinio simbolio jie gali naudoti bet kokį raidžių ir skaičių derinį, pabraukimą arba dolerio ženklus:

 ([a-zA-Z_$][a-zA-Z\d_$]*\.)*[a-zA-Z_$][a-zA-Z\d_$]* ------------------------ ----------------------- NN 

Jie taip pat negali būti rezervuotas žodis (pavyzdžiui, import , true ar null ). Jei norite patikrinti patikimumą, pakanka. Jei taip pat norite patikrinti teisingumą, taip pat turėtumėte patikrinti rezervuotų žodžių sąrašą.

„Java“ identifikatoriuose gali būti bet kokia „Unicode“ raidė, o ne tik „lotynų kalba“. Jei norite tai patikrinti, naudokite Unicode simbolių klases:

 ([\p{Letter}_$][\p{Letter}\p{Number}_$]*\.)*[\p{Letter}_$][\p{Letter}\p{Number}_$]* 

arba, trumpai

 ([\p{L}_$][\p{L}\p{N}_$]*\.)*[\p{L}_$][\p{L}\p{N}_$]* 

„Java“ kalbos specifikacijoje (3.8 skyrius) yra visa informacija apie galiojančius identifikatorių pavadinimus.

Taip pat žr. Atsakymą į šį klausimą: „ Java Unicode“ kintamieji pavadinimai

61
05 марта '11 в 20:28 2011-03-05 20:28 atsakymas į Tomalak pateikiamas kovo 11 d. 11 val. 20:28 2011-03-05 20:28

Čia yra pilnavertė darbo klasė su testais, pagrįsti puikiais komentarais. @ Alan-moore

 import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.regex.Pattern; import org.junit.Test; public class ValidateJavaIdentifier { private static final String ID_PATTERN = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"; private static final Pattern FQCN = Pattern.compile(ID_PATTERN + "(\\." + ID_PATTERN + ")*"); public static boolean validateJavaIdentifier(String identifier) { return FQCN.matcher(identifier).matches(); } @Test public void testJavaIdentifier() throws Exception { assertTrue(validateJavaIdentifier("C")); assertTrue(validateJavaIdentifier("Cc")); assertTrue(validateJavaIdentifier("bC")); assertTrue(validateJavaIdentifier("b.Cc")); assertTrue(validateJavaIdentifier("aAa.b.Cc")); assertTrue(validateJavaIdentifier("abCc")); // after the initial character identifiers may use any combination of // letters and digits, underscores or dollar signs assertTrue(validateJavaIdentifier("abC_c")); assertTrue(validateJavaIdentifier("abC$c")); assertTrue(validateJavaIdentifier("abC9")); assertFalse("cannot start with a dot", validateJavaIdentifier(".C")); assertFalse("cannot have two dots following each other", validateJavaIdentifier("b..C")); assertFalse("cannot start with a number ", validateJavaIdentifier("b.9C")); } } 
7
19 дек. Atsakymą pateikė Renaud gruodžio 19 d. 2014-12-19 11:28 '14 at 11:28 2014-12-19 11:28

„Renault“ pateiktas pavyzdys veikia. Bet, kiek aš galiu pasakyti, jis visuomet pasitrauks.

Norėdami jį optimizuoti, galite pakeisti pirmąją pusę paskutiniu. Atkreipkite dėmesį į punktyrinį sutapimą, kuris taip pat turi būti pakeistas.

Žemiau yra mano versija, kuri yra maždaug dvigubai greitesnė nei originalas:

 String ID_PATTERN = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"; Pattern FQCN = Pattern.compile(ID_PATTERN + "(\\." + ID_PATTERN + ")*"); 

Negaliu rašyti komentarų, todėl aš nusprendžiau parašyti atsakymą.

4
05 июня '15 в 11:25 2015-06-05 11:25 Atsakymą pateikė Jörgen Lundgren birželio 15 d. 15 val. 11:25 2015-06-05 11:25

Aš atėjau (pats) prie panašaus atsakymo (pvz., Tomalak atsakymo), kažką panašaus į MMMN:

 ([az][a-z_0-9]*\.)*[A-Z_]($[A-Z_]|[\w_])* 

Kur

 M = ([az][a-z_0-9]*\.)* N = [A-Z_]($[A-Z_]|[\w_])* 

Tačiau ši nuolatinė išraiška (priešingai nei Tomalak atsakymas) daro daugiau prielaidų:

  • Pakuotės pavadinimas (M dalis) bus tik mažosiomis raidėmis, pirmasis M ženklas visada bus mažos raidės, likusi dalis gali maišyti pabrauktus, mažesnius raides ir skaičius.

  • Klasės pavadinimas (N dalis) visada prasideda didžiosiomis raidėmis arba pabraukimu, o likusi dalis gali sumaišyti pabrauktus, raides ir skaičius. Vidinės klasės visada prasideda dolerio ženklu ($) ir turi atitikti anksčiau aprašytas klasės pavadinimo taisykles.

Pastaba: „ W“ modelis yra raidžių ir skaičių XSD modelis (jame nėra \ t

Tikiuosi šios pagalbos.

2
07 сент. Atsakymą pateikė Carlitos Way 07 Sep. 2013-09-07 01:41 '13 ne 1:41 2013-09-07 01:41

trumpesnė darbo reguliariosios išraiškos versija:

 \p{Alnum}[\p{Alnum}._]+\p{Alnum} 
0
22 марта '17 в 23:12 2017-03-22 23:12 atsakymą pateikė Diego Plentz , kovo 22 d., 17 val., 11:12, 2017-05-03 22:12

Ši išraiška puikiai tinka man.

 ^[az][a-z0-9_]*(\.[a-z0-9_]+)+$ 
0
28 июля '16 в 14:04 2016-07-28 14:04 atsakymą pateikė gopalanrc, liepos 28 d., 16 val. 14:04 2016-07-28 14:04

Ši klasė patikrina pateikto paketo pavadinimo teisingumą:

 import java.util.HashSet; public class ValidationUtils { // All Java reserved words that must not be used in a valid package name. private static final HashSet reserved; static { reserved = new HashSet(); reserved.add("abstract");reserved.add("assert");reserved.add("boolean"); reserved.add("break");reserved.add("byte");reserved.add("case"); reserved.add("catch");reserved.add("char");reserved.add("class"); reserved.add("const");reserved.add("continue");reserved.add("default"); reserved.add("do");reserved.add("double");reserved.add("else"); reserved.add("enum");reserved.add("extends");reserved.add("false"); reserved.add("final");reserved.add("finally");reserved.add("float"); reserved.add("for");reserved.add("if");reserved.add("goto"); reserved.add("implements");reserved.add("import");reserved.add("instanceof"); reserved.add("int");reserved.add("interface");reserved.add("long"); reserved.add("native");reserved.add("new");reserved.add("null"); reserved.add("package");reserved.add("private");reserved.add("protected"); reserved.add("public");reserved.add("return");reserved.add("short"); reserved.add("static");reserved.add("strictfp");reserved.add("super"); reserved.add("switch");reserved.add("synchronized");reserved.add("this"); reserved.add("throw");reserved.add("throws");reserved.add("transient"); reserved.add("true");reserved.add("try");reserved.add("void"); reserved.add("volatile");reserved.add("while"); }  public static final boolean isValidPackageName(String name) { String[] parts=name.split("\\.",-1); for (String part:parts){ System.out.println(part); if (reserved.contains(part)) return false; if (!validPart(part)) return false; } return true; }  private static boolean validPart(String part){ if (part==null || part.length()<1){ // Package part is null or empty ! return false; } if (Character.isJavaIdentifierStart(part.charAt(0))){ for (int i = 0; i < part.length(); i++){ char c = part.charAt(i); if (!Character.isJavaIdentifierPart(c)){ // Package part contains invalid JavaIdentifier ! return false; } } }else{ // Package part does not begin with a valid JavaIdentifier ! return false; } return true; } } 
0
02 янв. David Lev atsakymas , sausio 02 d 2017-01-02 16:03 '17, 16:03 pm 2017-01-02 16:03

Aš pasakysiu kažką panašaus ([\w]+\.)*[\w]+

Bet gal aš galiu būti konkretesnis, žinodamas, ką norite su juo daryti;)

-3
05 марта '11 в 20:11 2011-03-05 20:11 atsakymą pateikė krtek kovo 05 '11, 20:11 2011-03-05 20:11

Kiti klausimai apie arba Užduoti klausimą