Hoe koppelt u “elk teken” aan een reguliere expressie?

Het volgende moet overeenkomen:

AAA123
ABCDEFGH123
XXXX123

kan ik doen: ".*123"?


Antwoord 1, autoriteit 100%

Ja, dat kan. Dat zou moeten werken.

  • .= elk teken behalve nieuwe regel
  • \.= het werkelijke puntteken
  • .?= .{0,1}= match elk teken behalve de nieuwe regel nul of één keer
  • .*= .{0,}= match elk teken behalve de nieuwe regel nul of meer keer
  • .+= .{1,}= match een of meerdere keren met elk teken behalve de nieuwe regel

Antwoord 2, autoriteit 8%

Ja, dat werkt, maar houd er rekening mee dat .niet overeenkomt met nieuwe regels, tenzij je de DOTALLmarkeer bij het compileren van de uitdrukking:

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

Antwoord 3, autoriteit 4%

Gebruik het patroon .om een willekeurig teken één keer te matchen, .*om een willekeurig teken nul of meer keer te matchen, .+om een willekeurig teken te matchen teken een of meerdere keren.


Antwoord 4, autoriteit 3%

De meest gebruikelijke manier die ik heb gezien om dit te coderen is met een tekenklasse waarvan de leden een partitie vormen van de verzameling van alle mogelijke tekens.

Meestal schrijven mensen dat als [\s\S](witruimte of niet-witruimte), hoewel [\w\W], [\d\D], enz. zouden allemaal werken.


Antwoord 5

Er zijn veel geavanceerde regex-test- en ontwikkelingstools, maar als je gewoon een eenvoudig testharnas in Java wilt, is hier een om mee te spelen:

   String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }

Je kunt nu eenvoudig nieuwe testcases toevoegen en nieuwe patronen uitproberen. Veel plezier met het verkennen van regex.

Zie ook


Antwoord 6

.*en .+zijn voor alle tekens, behalve voor nieuwe regels.

Dubbele ontsnapping

Voor het geval u nieuwe regels zou willen toevoegen, kunnen de volgende uitdrukkingen ook werken voor talen waarvoor dubbele escaping vereist is, zoals Java of C++:

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*

voor nul of meer keren, of

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+

een of meerdere keren.

Enkele ontsnapping:

Dubbele escaping is niet vereist voor sommige talen, zoals C#, PHP, Ruby, PERL, Python, JavaScript:

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+

Test

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));
        }
    }
}

Uitvoer

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123
Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123
Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

Als je de uitdrukking wilt verkennen, wordt dit uitgelegd in het rechterbovenpaneel van regex101.com. Als je wilt, kun je ook in deze linkkijken hoe deze overeenkomt met enkele voorbeeldinvoer.


RegEx-circuit

jex.imvisualiseert reguliere expressies:


Antwoord 7

Nee, *komt overeen met nul of meer tekens. U moet +gebruiken, die in plaats daarvan overeenkomt met een of meer.

Deze uitdrukking werkt mogelijk beter voor u: [A-Z]+123


Antwoord 8

Specifieke oplossing voor het voorbeeldprobleem:-

Probeer [A-Z]*123$komt overeen met 123, AAA123, ASDFRRF123. Als je minimaal een teken voor 123nodig hebt, gebruik dan [A-Z]+123$.

Algemene oplossing voor de vraag (Hoe “elk teken” in de reguliere expressie te matchen):

  1. Als je iets zoekt, inclusief witruimte, kun je [\w|\W]{min_char_to_match,}proberen.
  2. Als je iets probeert te matchen behalve witruimte, kun je [\S]{min_char_to_match,}proberen.

Antwoord 9

Probeer de regex .{3,}. Dit komt overeen met alle tekens behalve een nieuwe regel.


Antwoord 10

[^]moet overeenkomen met elk teken, inclusief nieuwe regel. [^CHARS]komt overeen met alle tekens behalve die in CHARS. Als CHARSleeg is, komt het overeen met alle tekens.

JavaScript-voorbeeld:

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

Antwoord 11

Ik werk dit. Niet altijd betekent een punt een teken. Uitzondering bij enkellijnsmodus. \p{all}moet

. zijn

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");
}

Other episodes