Nasıl c # regex kullanarak belirli bir kelime önce rakamlar almak için?


10

Kelimelerin önündeki rakamları almak için aşağıdaki normal ifadeyi kullanacağız.

Misal :

Toplam 8 Resimden 8.

(\d+)\s*someWord

Ancak bazen Sayı ve kelime arasında bir şey gelir.Lütfen aşağıdaki örnek çizgiye bakın.

Ör:

43434 bir şey 12 bir şey bir şey 2323 yeni bir şey

Regex kullanarak bu kelimeden önceki tam rakamı nasıl alabilirim?

Lütfen bana önerilerinizi verin.


3
Görünüşe göre mevcut gönderiler sorunuza cevap veriyor. Yanıtları faydalı bulursanız lütfen yanıtlayanlara ve gelecekteki okuyuculara bildirin ( Tur atın ). Aksi takdirde, lütfen ne aradığınız ve cevapların neden sizin durumunuza uygun olmadığı hakkında daha fazla bilgi verin.
Reza Aghaei

1
Ne istediğini belli değil ...
JohnyL

Yanıtlar:


14

Bunu yap:

(\d+)[^\d]+some[wW]ord

Rakamların dışında herhangi bir şeyi kabul etmeniz gerekir. Ayrıca ikisini de düşündüm wve Wörnekleriniz ikisini de içerdiğinden.

gösteri


Farklı bir cevap mı arıyorsunuz?
Reza Aghaei

@RezaAghaei maybe
CinCout

Şu anda verdiğiniz yanıtla ilgili sorunlar nelerdir? Ne gibi iyileştirmeler arıyorsunuz?
Reza Aghaei

@RezaAghaei OP'nin herhangi bir yanıtı kabul etmediği gerçeği, bir köşe davasını veya başka bir şeyi kaçırırsam beni düşündürüyor. Bunu çözmek için alternatif yaklaşımlar da kabul edilir.
CinCout

1
@ CinCout-ReinstateMonica Olası bir cevapsız kenar durumu için lütfen cevabımı inceleyin (bunun OP ile ilgili olup olmadığından emin değilim).
Steve Chambers


3

İçin eşleşme varsa CinCout cevabı dan muhtemel bir "cevapsız köşe durumda" dir someWordeğer örneğin tam olmalıdır notsomeWordve someWordNotThisuyumlu edilmemelidir.

Bu normal ifadenin aşağıdaki uzantısı, bunu ele almanın bir yolunu sunar:

(\d+)[^\d]*[^\w]some[wW]ord[^\w]

Açıklama:[^\w] önce veya için Eşleştirici sonra someWordbir için bir görünüm "sözcük olmayan karakteri" önce ve sonra - hattın bir ucu da burada sayar. Kesin gereksinimlere bağlı olarak bu daha karmaşık / spesifik hale getirilebilir.

gösteri


3

Böyle bir şey deneyebilirsiniz:

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

Testi burada görebilirsiniz


3

önce some[wW]ord, numberve spacebir desenle ayırdıktan sonra üzerinde ikinci deseni yürütün

 var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
 var rgx = new Regex(pattern);
 var sentence = "43434 of someword 12 anything someword 2323 new someword";
 var result = string.Empty;
 foreach (Match match in rgx.Matches(sentence)){
     result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword

 var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
 var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);

 var resultOnCorrectSentence = new List<string>();
 foreach (Match match in rgxOnCorrectSentence.Matches(result)){
     resultOnCorrectSentence.Add(match.Value);
 }
 resultOnCorrectSentence.ForEach(Console.WriteLine);

 Console.ReadKey();

İlk kalıp yürütüldüğünde, cümle istediğiniz gibi olacaktır

43434 bir şey 12 bir şey bir şey 2323 yeni bir şey

değişiklik:

43434 bir şey 12 bir şey 2323 bir şey


2

Ancak bazen Sayı ve kelime arasında bir şey gelir.Lütfen aşağıdaki örnek çizgiye bakın.

Ör:

43434 bir şey 12 bir şey bir şey 2323 yeni bir şey

bunu dene

(\ D +) (. *?) Someword

Açıklaması

\ d + - sayılar

. *? - sayılardan sonra minimum oluşum hariç her şey

someword - biraz eşleşmesi

gösteri


2

Kullanımı \s*yalnızca 0 veya daha fazla boşluk karakteriyle eşleşir.

Kullanabilirsiniz, \D+ancak basamak hariç herhangi bir karakterle eşleştiği için yeni satırlarla da eşleşir.

Aynı satırdaki rakamları eşleştirmek istiyorsanız, bir satırsonunu reddedilen bir karakter sınıfıyla eşleştirmemeyi ekleyebilirsiniz [^\d\r\n]

Örneğinizde kullanırsınız \d, ancak yalnızca 1 veya daha fazla 0-9 basamağını eşleştirmek istiyorsanız bir karakter sınıfı kullanabilirsiniz[0-9]+

Rakamların ve sözcüğün daha büyük bir sözcüğün parçası olmasını önlemek için sözcük sınırlarını kullanabilirsiniz \b

Kelimeyi büyük / küçük harfe duyarlı olmayan bir şekilde eşleştirmek istiyorsanız RegexOptions.IgnoreCaseveya satır içi değiştirici kullanabilirsiniz(?i)

(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b

.NET normal ifade demosuna bakın


2

mtch.Groups["Value"].ValueBilgileri gerektiği gibi ayıklamak için Adlandırılmış Eşleştirme Yakalamalarını (veri kullanımı ... vb.) Kullanın .

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.

Yukarıda çalıştırıldığında ( ile IgnorePatternWhiteSpaceaksi yorumları kaldırmak ve bu şekilde çalıştırmak için desen katılmak (?<Value>\d+)(?<Other>.+?)(?<Key>someword)hiçbir regex seçenekleri ile ) her Veri / Anahtar çiftleri için veri alır ve tek bir maçta her düzenlemektedir.

Sonuç

Hepsi tek tek maçlarda yer alan sonuç (ikinci örneğiniz için) ve her maçta grupları ve yakalamaları sağlar:

Match #0
              [0]:  43434˽of˽someword
  ["Value"]  [1]:  43434
      1 Captures:  43434
  ["Other"]  [2]:  ˽of˽
      2 Captures:  ˽of˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #1
              [0]:  12˽anything˽someword
  ["Value"]  [1]:  12
      1 Captures:  12
  ["Other"]  [2]:  ˽anything˽
      2 Captures:  ˽anything˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #2
              [0]:  2323˽new˽someword
  ["Value"]  [1]:  2323
      1 Captures:  2323
  ["Other"]  [2]:  ˽new˽
      2 Captures:  ˽new˽
    ["Key"]  [3]:  someword
  3 Captures:  someword

Görsel olarak burada eşleşen:

resim açıklamasını buraya girin

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.