Normal ifadede “herhangi bir karakter” nasıl eşleştirilir?


304

Aşağıdakiler eşleştirilmelidir:

AAA123
ABCDEFGH123
XXXX123

Yapabileceğim: ".*123"?


2
Bu bağlantı işe yarıyor gibi görünüyor -> [^] + Bu, 'hiçbir karakterle eşleşmiyor' anlamına gelir, 'herhangi bir karakterle eşleştir' olarak yeniden okunabilen çift negatiftir. Kaynak - loune.net/2011/02/…
HockeyJ

Yanıtlar:


644

Evet yapabilirsin. Bu işe yaramalı.

  • . = herhangi bir karakter
  • \. = gerçek nokta karakteri
  • .?= .{0,1}= sıfır veya bir kez eşleştir
  • .*= .{0,}= sıfır veya daha fazla karakterle eşleş
  • .+= .{1,}= herhangi bir karakterle bir veya daha fazla kez eşleş

22
Her zaman nokta herhangi bir karakter anlamına gelir. Tek satır modunda istisna. \ p {all}
martian

Bu karakter listesine ters eğik çizgiyi nasıl dahil edebilirsiniz?
Arama Sonuçları Web sonuçları Pi

1
@pippilongstocking Geriye eğik çizgi `\\`
Poutrathor

58

Evet, işe yarayacaktır, ancak ifadeyi derlerken DOTALL bayrağını .geçmediğiniz sürece yeni satırlarla eşleşmeyeceğini unutmayın :

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

11
Bu çok faydalı bilgiler! Yeni .satırlarla eşleşeceğini varsaydım . Cevabınızı okuduğuma sevindim, bunu kullanmam gerek!
Ben Kane

Bazen Eclipse'de çok satırlı normal ifade araması yaparken veya normal ifade araması sunan herhangi bir Java uygulamasının bir kullanıcısı gibi Java regexes'lerindeki satırsonlarını Pattern.DOTALL'u geçemediğiniz bağlamlarda eşleştirmeniz gerekebilir. Regular-expression.info'nun rehberine dayanarak, {.,\n,\r,\u2028,\u2029,\u0085}kesinlikle herhangi bir karakteri eşleştirmek için kullanmanız gerekebilir (Unicode karakterleri, .Java ile eşleşmeyen ek satır sonlandırma karakteridir ), ancak {.,\n,\r}çoğu metin dosyası için çalışır.
Theodore Murdock

8
@TheodoreMurdock [\s\S], DOTALL kullanamıyorsanız herhangi bir karakteri eşleştirmenin popüler bir yoludur.
mpen

Durumda KULLANMAYIN, aklınıza gelirdi (?:.|\\v)*çünkü, JDK-6337993 .
Olivier Cailloux

22

Deseni .herhangi bir karakteri bir kez .*eşleştirmek, herhangi bir karakteri sıfır veya daha fazla .+eşleştirmek, herhangi bir karakteri bir veya daha fazla kez eşleştirmek için kullanın.


11

Çok sayıda karmaşık normal ifade testi ve geliştirme aracı vardır, ancak Java'da basit bir test koşum takımı istiyorsanız, burada oynamak için bir tane var:

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

Artık kolayca yeni testcasları ekleyebilir ve yeni desenler deneyebilirsiniz. Normal regex keşfetmek eğlenin.

Ayrıca bakınız


1
Sadece regular-expressions.info bağlantısı için oy verin. Düzenli ifadeleri öğrenmek ve referans için harika bir site.
Freiheit

9

Hayır, *sıfır veya daha fazla karakterle eşleşir. Kullanmalısın+ yerine bir ya da daha fazlasıyla eşleşen kullanmalısınız.

Bu ifade sizin için daha iyi olabilir: [A-Z]+123


1
Burada oy verin. OP belirtmedi, ancak kalıbın OP'nin isteyemeyeceği ### 123, 123123,% $ # 123 gibi herhangi bir karakterle eşleşeceğini eklemek doğru görünüyor. @Huusom'un yukarıda kullandığı karakter sınıfı, tüm OP'nin yalnızca amacı olan büyük harfli alfabetik karakterleri kullanmasını sağlar.
techdude

9

Bunu kodlamak için gördüğüm en yaygın yolu, üyeleri olası tüm karakter kümesinin bir bölümünü oluşturan bir karakter sınıfı ile.

Genellikle insanların yazmasını bu kadar [\s\S]olsa (boşluk ya da olmayan boşluk), [\w\W], [\d\D]vb tüm çalışma olur.


2
Referans olarak, regular-expressions.info/dot.html adresinden : "JavaScript ve VBScript'te nokta eşleme satırı kesme karakterleri oluşturma seçeneği yoktur. Bu dillerde, [\ s \ S] gibi bir karakter sınıfı kullanabilirsiniz Bu karakter, boşluk karakteri (satır sonu karakterleri dahil) veya boşluk karakteri olmayan bir karakterle eşleşir.Tüm karakterler boşluk veya boşluk olmadığından, bu karakter sınıfı herhangi bir karakterle eşleşir ."
Dean Veya

7

.*ve .+yeni satırlar hariç herhangi bir karakter içindir.

Çift Kaçış

Yeni satırlar eklemek istemeniz durumunda, Java veya C ++ gibi çift çıkış gerektiren bu diller için aşağıdaki ifadeler de kullanılabilir:

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

sıfır veya daha fazla kez, veya

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

bir veya daha fazla kez.

Tek Kaçış:

C #, PHP, Ruby, PERL, Python, JavaScript gibi bazı diller için çift çıkış gerekli değildir:

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

Ölçek

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

Çıktı

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

İfadeyi keşfetmek istiyorsanız, regex101.com'un sağ üst panelinde açıklanmıştır . İsterseniz, bu bağlantıda bazı örnek girişlerle nasıl eşleşeceğini de izleyebilirsiniz .


RegEx Devresi

jex.im düzenli ifadeleri görselleştirir:

resim açıklamasını buraya girin


1
Burada zaten cevaplanmadı mı? stackoverflow.com/a/55149095/5424988
Dördüncü kuş

(\W|\w)*çift ​​kaçan yerine seviyorum
Sudip Bhattarai

1
Gerçekten yararlı açıklayan
Nagibaba

5

Örnek problem için özel çözüm: -

Deneyin [A-Z]*123$maç olacak 123, AAA123, ASDFRRF123. Eğer daha önce en az bir karakter ihtiyaç 123kullanım [A-Z]+123$.

Sorunun Genel Çözümü (Normal ifadede "herhangi bir karakter" nasıl eşleştirilir):

  1. Boşluk dahil herhangi bir şey arıyorsanız deneyebilirsiniz [\w|\W]{min_char_to_match,}.
  2. Boşluk dışında bir şey eşleştirmeye çalışıyorsanız deneyebilirsiniz [\S]{min_char_to_match,}.

2

[^]newline dahil herhangi bir karakterle eşleşmelidir. [^CHARS] olanlar dışındaki tüm karakterleri ile eşleşen KRKTR'lerin . Eğer KRKTR'lerin boş, hepsi karakterle eşleşir.

JavaScript örneği:

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

Neyi denediğinizi bize bildirmek için kod eklemeyi düşünür müsünüz?
Jennis Vaishnav

1

Normal ifadeyi deneyin .{3,}. Bu, yeni bir satır dışındaki tüm karakterlerle eşleşir.


-4

Ben her zaman değil nokta herhangi bir karakter anlamına gelir. Tek satır modunda istisna. \p{all}olmalı

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");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.