Comment faire correspondre «n'importe quel caractère» dans l'expression régulière?


305

Les éléments suivants doivent correspondre:

AAA123
ABCDEFGH123
XXXX123

puis-je faire ".*123":?


2
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

22
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:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();

11
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.


11

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.

Voir également


1
Votez juste pour le lien regular-expressions.info. Site merveilleux pour apprendre les expressions régulières et pour référence.
Freiheit

9

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


1
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.


2
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;


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher 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));
        }
    }
}

Production

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

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:

entrez la description de l'image ici


1
N'est-ce pas déjà répondu ici? stackoverflow.com/a/55149095/5424988
Le quatrième oiseau

j'aime (\W|\w)*au lieu de double échapper
Sudip Bhattarai


5

Solution spécifique à l'exemple de problème: -

Essayez [A-Z]*123$correspondront 123, AAA123, ASDFRRF123. Dans le cas où vous avez besoin d'au moins un caractère avant 123utilisation [A-Z]+123$.

Solution générale à la question (Comment faire correspondre "n'importe quel caractère" dans l'expression régulière):

  1. Si vous cherchez quelque chose, y compris des espaces, vous pouvez essayer [\w|\W]{min_char_to_match,}.
  2. Si vous essayez de faire correspondre autre chose que des espaces, vous pouvez essayer [\S]{min_char_to_match,}.

2

[^]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:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.

Pourriez-vous ajouter du code pour nous faire savoir ce que vous avez essayé?
Jennis Vaishnav

1

Essayez l'expression régulière .{3,}. Cela correspondra à tous les caractères sauf une nouvelle ligne.


-4

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");
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.