Normal ifade konu dizesindeki boşluk nasıl yoksayılır?


108

Normal ifade kalıbı kullanarak eşleşmeleri ararken hedef dizedeki beyaz boşluğu yok saymanın basit bir yolu var mı? Örneğin, aramam "kediler" içinse, "c ats" veya "ca ts" nin eşleşmesini isterim. Önceden beyaz boşluğu çıkaramıyorum çünkü eşleşmeyi vurgulamak için eşleşmenin başlangıç ​​ve bitiş indeksini (herhangi bir boşluk dahil) bulmam gerekiyor ve biçimlendirme amacıyla boşlukların orada olması gerekiyor.

Yanıtlar:


125

Normal ifadenizdeki \s*diğer tüm karakterlerin arasına isteğe bağlı boşluk karakterleri yapıştırabilirsiniz . Verilmiş olmasına rağmen, biraz uzun sürecek.

/cats/ -> /c\s*a\s*t\s*s/


Teşekkürler, gitmenin yolu bu gibi görünüyor. Ancak, isteğe bağlı boşluk karakterlerini yalnızca yeni satırı takip ediyorlarsa istediğimi fark ettim. Örneğin, "c \ n ats" veya "ca \ n ts" eşleşmelidir. Ancak satırsonu yoksa "c ats" nın eşleşmesini istemezsiniz. Bunun nasıl yapılabileceğine dair bir fikriniz var mı?
Steven

@Steven, aşağıda nasıl yaptığımı görün, çözümümü bu tür özel durumlara kolayca uyarlayabilirsiniz.
Bob

@chris Sanırım, bu normal ifade yalnızca kediler için çok katıdır, aynı zamanda aşağıdaki gibi herhangi bir harf araması için de yazabilir: ^([a-z]\s*)+$
Sandeep Kaur

9

Steven'ın Sam Dufel'in cevabına yaptığı yorumu ele alırken

Teşekkürler, gitmenin yolu bu gibi görünüyor. Ancak, isteğe bağlı boşluk karakterlerini yalnızca yeni satırı takip ediyorlarsa istediğimi fark ettim. Örneğin, "c \ n ats" veya "ca \ n ts" eşleşmelidir. Ancak satırsonu yoksa "c ats" nın eşleşmesini istemezsiniz. Bunun nasıl yapılabileceğine dair bir fikriniz var mı?

Bu hile yapmalı:

/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/

Bunun eşleşen tüm farklı "kediler" varyasyonları için bu sayfaya bakın .

Bunu koşul ifadeleri kullanarak da çözebilirsiniz , ancak bunlar regex'in javascript çeşidinde desteklenmez.


3
Çok çirkin. Daha iyi bir yolu olmalı.
james.garriss

JS sözdiziminde (teknik diğer dillerde çalışacak olsa da) daha okunaklı hale getirebilirsiniz:new RegExp('cats'.split('').join('(?:\n\s*)?'))
brianary

7

Kabul edilen cevap teknik olarak doğru olsa da, mümkünse daha pratik bir yaklaşım, hem normal ifadeden hem de arama dizesinden beyaz boşlukları çıkarmaktır.

Bunun yerine "kedilerim" i aramak istiyorsanız:

myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)

Sadece yap:

myString.replace(/\s*/g,"").match(/mycats/g)

Uyarı: Bunu normal ifadede tüm boşlukları boş dizelerle değiştirerek otomatikleştiremezsiniz çünkü bunlar bir olumsuzlamada ortaya çıkabilir veya normal ifadenizi geçersiz kılabilir.


5

Sen koyabilirsiniz \s*Eğer kullandığınız kedi aradılar eğer öyleyse Arama dizisi her karakter İnbetweenc\s*a\s*t\s*s\s*s

Uzun ama tabii ki dinamik olarak dizgiyi oluşturabilirsiniz.

Burada çalıştığını görebilirsiniz: http://www.rubular.com/r/zzWwvppSpE


3

Yalnızca boşluklara izin vermek istiyorsanız, o zaman

\bc *a *t *s\b

yapmalı. Sekmelere de izin vermek için kullanın

\bc[ \t]*a[ \t]*t[ \t]*s\b

Veya gibi kelimelerin içinde \bde bulmak istiyorsanız çapaları kaldırın .catsbobcatscatsup


1

Bu yaklaşım, bunu otomatikleştirmek için kullanılabilir (aşağıdaki örnek çözüm python içindedir, ancak açıkça herhangi bir dile taşınabilir):

beyaz boşluğu önceden çıkarabilir VE boşluk olmayan karakterlerin konumlarını kaydedebilir, böylece bunları daha sonra orijinal dizedeki eşleşen dize sınır konumlarını aşağıdaki gibi bulmak için kullanabilirsiniz:

def regex_search_ignore_space(regex, string):
    no_spaces = ''
    char_positions = []

    for pos, char in enumerate(string):
        if re.match(r'\S', char):  # upper \S matches non-whitespace chars
            no_spaces += char
            char_positions.append(pos)

    match = re.search(regex, no_spaces)
    if not match:
        return match

    # match.start() and match.end() are indices of start and end
    # of the found string in the spaceless string
    # (as we have searched in it).
    start = char_positions[match.start()]  # in the original string
    end = char_positions[match.end()]  # in the original string
    matched_string = string[start:end]  # see

    # the match WITH spaces is returned.
    return matched_string

with_spaces = 'a li on and a cat'
print(regex_search_ignore_space('lion', with_spaces))
# prints 'li on'

Daha ileri gitmek istiyorsanız, eşleşme nesnesini oluşturabilir ve bunun yerine geri getirebilirsiniz, böylece bu yardımcının kullanımı daha kullanışlı olacaktır.

Ve bu fonksiyonun performansı elbette optimize edilebilir, bu örnek sadece bir çözüme giden yolu göstermek içindir.

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.