Ce lien montre une approche qui semble fonctionner -> [^] + Ce qui signifie «ne correspond à aucun caractère», un double négatif qui peut être relu comme «correspondre à n'importe quel caractère». Source - loune.net/2011/02/…
HockeyJ
Réponses:
645
Oui, vous pouvez. Cela devrait fonctionner.
. = tout caractère
\. = le caractère de point réel
.?= .{0,1}= correspond à n'importe quel caractère zéro ou une fois
.*= .{0,}= correspond à tout caractère zéro ou plusieurs fois
.+= .{1,}= correspond à tout caractère une ou plusieurs fois
Pas toujours un point signifie n'importe quel caractère. Exception en mode ligne unique. \ p {all} devrait être
martien
Comment pouvez-vous inclure une barre oblique inverse à cette liste de personnages?
Résultats de la recherche Résultats Web Pi
1
@pippilongstocking La barre oblique vers l'arrière est `\\`
Poutrathor
58
Oui, cela fonctionnera, mais notez que .cela ne correspondra pas aux retours à la ligne sauf si vous passez l' indicateur DOTALL lors de la compilation de l'expression:
Voilà des informations très utiles! Je supposais que .cela correspondrait aux nouvelles lignes. Je suis content d'avoir lu votre réponse, je dois l'utiliser!
Ben Kane
Vous pouvez également parfois avoir besoin de faire correspondre des sauts de ligne dans les expressions régulières Java dans des contextes où vous ne pouvez pas passer Pattern.DOTALL, comme lors d'une recherche d'expression régulière sur plusieurs lignes dans Eclipse, ou en tant qu'utilisateur d'une application Java qui offre une recherche régulière. Basé sur le guide de regular-expression.info , vous devrez peut-être utiliser {.,\n,\r,\u2028,\u2029,\u0085}pour faire correspondre absolument n'importe quel caractère (les caractères Unicode sont des caractères de fin de ligne supplémentaires ajoutés qui ne correspondent pas .en Java), mais {.,\n,\r}cela fonctionnerait pour la plupart des fichiers texte.
Theodore Murdock
8
@TheodoreMurdock [\s\S]est un moyen populaire de faire correspondre n'importe quel personnage si vous ne pouvez pas utiliser DOTALL.
mpen
Dans le cas où cela vous viendrait à l'esprit, ne l'utilisez PAS (?:.|\\v)*, à cause du JDK-6337993 .
Olivier Cailloux
22
Utilisez le modèle .pour faire correspondre n'importe quel caractère une fois, .*pour faire correspondre n'importe quel caractère zéro ou plusieurs fois, .+pour faire correspondre n'importe quel caractère une ou plusieurs fois.
Il existe de nombreux outils de développement et de test regex sophistiqués, mais si vous voulez juste un simple harnais de test en Java, en voici un pour jouer avec:
String[] tests ={"AAA123","ABCDEFGH123","XXXX123","XYZ123ABC","123123","X123","123",};for(String test : tests){System.out.println(test +" "+test.matches(".+123"));}
Maintenant, vous pouvez facilement ajouter de nouveaux tests et essayer de nouveaux modèles. Amusez-vous à explorer l'expression régulière.
Votez ici. L'OP n'a pas précisé, mais il semble correct d'ajouter que le modèle correspondra à n'importe quel caractère, y compris des choses comme ### 123, 123123,% $ # 123 dont l'OP peut ne pas vouloir. La classe de caractères utilisée par @Huusom ci-dessus utilisera tous les OP pour n'utiliser que des caractères alphabétiques majuscules qui pourraient avoir été l'intention.
techdude
9
Le moyen le plus courant que j'ai vu pour coder cela est avec une classe de caractères dont les membres forment une partition de l'ensemble de tous les caractères possibles.
Habituellement , les gens écrivent que [\s\S](espaces ou des espaces), bien que [\w\W], [\d\D]etc. seraient tous les travaux.
Pour référence, à partir de regular-expressions.info/dot.html : "JavaScript et VBScript n'ont pas d'option pour faire les caractères de saut de ligne de correspondance de points. Dans ces langues, vous pouvez utiliser une classe de caractères telle que [\ s \ S] pour correspondre à n'importe quel caractère. Ce caractère correspond à un caractère qui est soit un espace (y compris les caractères de saut de ligne), soit un caractère qui n'est pas un espace. Comme tous les caractères sont soit des espaces, soit des espaces, cette classe de caractères correspond à n'importe quel caractère . "
Dean Or
7
.*et .+sont pour tous les caractères sauf pour les nouvelles lignes.
Double évasion
Au cas où vous souhaiteriez inclure de nouvelles lignes, les expressions suivantes pourraient également fonctionner pour les langages nécessitant un double échappement, tels que Java ou C ++:
[\\s\\S]*[\\d\\D]*[\\w\\W]*
pour zéro ou plusieurs fois, ou
[\\s\\S]+[\\d\\D]+[\\w\\W]+
pour une ou plusieurs fois.
Évasion simple:
Le double échappement n'est pas requis pour certains langages tels que C #, PHP, Ruby, PERL, Python, JavaScript:
[\s\S]*[\d\D]*[\w\W]*[\s\S]+[\d\D]+[\w\W]+
Tester
import java.util.regex.Matcher;import java.util.regex.Pattern;publicclassRegularExpression{publicstaticvoid main(String[] args){finalString regex_1 ="[\\s\\S]*";finalString regex_2 ="[\\d\\D]*";finalString regex_3 ="[\\w\\W]*";finalString string ="AAA123\n\t"+"ABCDEFGH123\n\t"+"XXXX123\n\t";finalPattern pattern_1 =Pattern.compile(regex_1);finalPattern pattern_2 =Pattern.compile(regex_2);finalPattern pattern_3 =Pattern.compile(regex_3);finalMatcher matcher_1 = pattern_1.matcher(string);finalMatcher matcher_2 = pattern_2.matcher(string);finalMatcher matcher_3 = pattern_3.matcher(string);if(matcher_1.find()){System.out.println("Full Match for Expression 1: "+ matcher_1.group(0));}if(matcher_2.find()){System.out.println("Full Match for Expression 2: "+ matcher_2.group(0));}if(matcher_3.find()){System.out.println("Full Match for Expression 3: "+ matcher_3.group(0));}}}
Si vous souhaitez explorer l'expression, cela a été expliqué dans le panneau supérieur droit de regex101.com . Si vous le souhaitez, vous pouvez également regarder dans ce lien , comment cela pourrait correspondre à certains exemples d'entrées.
[^]doit correspondre à n'importe quel caractère, y compris la nouvelle ligne. [^CHARS] correspond à tous les caractères sauf ceux de CHARS . Si CHARS est vide, il correspond à tous les caractères.
Je travaille ce point pas toujours signifie n'importe quel caractère. Exception en mode ligne unique. \p{all}devrait être
String value ="|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";String expression ="[a-zA-Z0-9\\p{all}]{0,50}";if(value.matches(expression)){System.out.println("true");}else{System.out.println("false");}
Réponses:
Oui, vous pouvez. Cela devrait fonctionner.
.
= tout caractère\.
= le caractère de point réel.?
=.{0,1}
= correspond à n'importe quel caractère zéro ou une fois.*
=.{0,}
= correspond à tout caractère zéro ou plusieurs fois.+
=.{1,}
= correspond à tout caractère une ou plusieurs foisla source
Oui, cela fonctionnera, mais notez que
.
cela ne correspondra pas aux retours à la ligne sauf si vous passez l' indicateur DOTALL lors de la compilation de l'expression:la source
.
cela correspondrait aux nouvelles lignes. Je suis content d'avoir lu votre réponse, je dois l'utiliser!{.,\n,\r,\u2028,\u2029,\u0085}
pour faire correspondre absolument n'importe quel caractère (les caractères Unicode sont des caractères de fin de ligne supplémentaires ajoutés qui ne correspondent pas.
en Java), mais{.,\n,\r}
cela fonctionnerait pour la plupart des fichiers texte.[\s\S]
est un moyen populaire de faire correspondre n'importe quel personnage si vous ne pouvez pas utiliser DOTALL.(?:.|\\v)*
, à cause du JDK-6337993 .Utilisez le modèle
.
pour faire correspondre n'importe quel caractère une fois,.*
pour faire correspondre n'importe quel caractère zéro ou plusieurs fois,.+
pour faire correspondre n'importe quel caractère une ou plusieurs fois.la source
Il existe de nombreux outils de développement et de test regex sophistiqués, mais si vous voulez juste un simple harnais de test en Java, en voici un pour jouer avec:
Maintenant, vous pouvez facilement ajouter de nouveaux tests et essayer de nouveaux modèles. Amusez-vous à explorer l'expression régulière.
Voir également
la source
Non,
*
correspondra à zéro ou plusieurs caractères. Vous devez utiliser+
, qui correspond à un ou plusieurs à la place.Cette expression pourrait mieux vous convenir:
[A-Z]+123
la source
Le moyen le plus courant que j'ai vu pour coder cela est avec une classe de caractères dont les membres forment une partition de l'ensemble de tous les caractères possibles.
Habituellement , les gens écrivent que
[\s\S]
(espaces ou des espaces), bien que[\w\W]
,[\d\D]
etc. seraient tous les travaux.la source
Double évasion
Au cas où vous souhaiteriez inclure de nouvelles lignes, les expressions suivantes pourraient également fonctionner pour les langages nécessitant un double échappement, tels que Java ou C ++:
pour zéro ou plusieurs fois, ou
pour une ou plusieurs fois.
Évasion simple:
Le double échappement n'est pas requis pour certains langages tels que C #, PHP, Ruby, PERL, Python, JavaScript:
Tester
Production
Si vous souhaitez explorer l'expression, cela a été expliqué dans le panneau supérieur droit de regex101.com . Si vous le souhaitez, vous pouvez également regarder dans ce lien , comment cela pourrait correspondre à certains exemples d'entrées.
Circuit RegEx
jex.im visualise les expressions régulières:
la source
(\W|\w)*
au lieu de double échapperSolution spécifique à l'exemple de problème: -
Essayez
[A-Z]*123$
correspondront123
,AAA123
,ASDFRRF123
. Dans le cas où vous avez besoin d'au moins un caractère avant123
utilisation[A-Z]+123$
.Solution générale à la question (Comment faire correspondre "n'importe quel caractère" dans l'expression régulière):
[\w|\W]{min_char_to_match,}
.[\S]{min_char_to_match,}
.la source
[^]
doit correspondre à n'importe quel caractère, y compris la nouvelle ligne.[^
CHARS]
correspond à tous les caractères sauf ceux de CHARS . Si CHARS est vide, il correspond à tous les caractères.Exemple JavaScript:
la source
Essayez l'expression régulière
.{3,}
. Cela correspondra à tous les caractères sauf une nouvelle ligne.la source
Je travaille ce point pas toujours signifie n'importe quel caractère. Exception en mode ligne unique.
\p{all}
devrait êtrela source