Bagaimana cara mendapatkan digit sebelum kata tertentu menggunakan regex di c #?


10

Kami akan menggunakan regex di bawah ini untuk mendapatkan digit sebelum kata-kata.

Contoh:

838123 someWord 8 someWord 12 someWord

(\d+)\s*someWord

Tapi kadang-kadang apa pun akan datang antara Angka dan kata. Silakan lihat contoh di bawah ini.

Ex:

43434 dariordord 12 apa punordord 2323ordord baru

Bagaimana cara mendapatkan angka yang tepat sebelum kata itu menggunakan regex?

Tolong beri saya saran Anda.


3
Sepertinya posting yang ada menjawab pertanyaan Anda. Harap beri tahu para penjawab dan pembaca yang akan datang jika Anda menemukan jawabannya bermanfaat (Ikuti tur ). Kalau tidak, berikan detail lebih lanjut tentang apa yang Anda cari dan mengapa jawabannya tidak sesuai dengan kasus Anda.
Reza Aghaei

1
Tidak jelas apa yang Anda tanyakan ...
JohnyL

Jawaban:


14

Melakukan hal ini:

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

Anda harus menerima apa pun selain angka itu sendiri. Saya juga mempertimbangkan keduanya wdan Wkarena contoh Anda mengandung keduanya.

Demo


Apakah Anda mencari jawaban yang berbeda?
Reza Aghaei

@RezaAghaei mungkin
CinCout

Apa masalah dengan jawaban saat ini yang Anda berikan? Perbaikan apa yang Anda cari?
Reza Aghaei

@RezaAghaei Fakta bahwa OP belum menerima jawaban apa pun membuat saya berpikir jika saya melewatkan kasus sudut atau sesuatu. Pendekatan alternatif untuk menyelesaikannya juga diterima.
CinCout

1
@ CinCout-ReinstateMonica Silakan lihat jawaban saya untuk kemungkinan kasus tepi terjawab (tidak yakin apakah ini relevan dengan OP).
Steve Chambers


3

Satu kemungkinan "kasus sudut terjawab" dari jawaban CinCout adalah jika kecocokan untuk someWordharus tepat, misalnya jikanotsomeWord dan someWordNotThistidak harus dicocokkan.

Ekstensi berikut untuk ekspresi reguler itu menyediakan cara untuk mengatasi ini:

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

Penjelasan: The [^\w]sebelum atau setelah matcher untuk someWordmencari sebuah "karakter non-kata" sebelum dan setelah - sebuah akhir baris juga penting di sini. Ini tentu saja dapat dibuat lebih kompleks / spesifik, tergantung pada persyaratan yang tepat.

Demo


3

Anda dapat mencoba sesuatu seperti ini:

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

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

Anda dapat melihat tesnya di sini


3

pertama-tama pisahkan some[wW]ord, numberdan spacedengan sebuah pola, kemudian jalankan pola kedua di atasnya

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

Ketika pola pertama dijalankan, kalimat akan seperti yang diinginkan

43434 dariordord 12 apa punordord 2323ordord baru

perubahan:

43434 seseorang 12 orang 2323 orang


2

Tapi kadang-kadang apa pun akan datang antara Angka dan kata. Silakan lihat contoh di bawah ini.

Ex:

43434 dariordord 12 apa punordord 2323ordord baru

coba ini

(\ d +) (. *?) sesuatu

Dijelaskan

\ d + - angka

. *? - apa pun setelah angka tetapi kejadian minimum.

sometord - kecocokan persis agak

Demo


2

Menggunakan \s*hanya akan cocok dengan 0 atau lebih karakter spasi putih.

Anda bisa menggunakan \D+tetapi itu juga akan cocok dengan baris baru karena cocok dengan karakter apa pun kecuali angka.

Jika Anda ingin mencocokkan digit pada baris yang sama, Anda dapat menambahkan tidak cocok dengan baris baru ke kelas karakter yang dinegasikan [^\d\r\n]

Dalam contoh Anda, Anda menggunakan \d, tetapi jika Anda hanya ingin mencocokkan 1 atau lebih angka 0-9 Anda bisa menggunakan kelas karakter[0-9]+

Untuk mencegah angka dan kata menjadi bagian dari kata yang lebih besar, Anda dapat menggunakan batas kata \b

Jika Anda ingin mencocokkan kata dengan case case insensitive, Anda bisa menggunakan RegexOptions.IgnoreCaseatau pengubah inline(?i)

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

Lihat demo .NET regex


2

Gunakan Capture Bernama Pencocokan (Untuk mendapatkan data gunakan mtch.Groups["Value"].Value... dll) untuk mengekstrak informasi sesuai kebutuhan.

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

Ketika hal di atas dijalankan ( dengan cara IgnorePatternWhiteSpacelain hapus komentar dan gabungkan pola untuk menjalankannya seperti (?<Value>\d+)(?<Other>.+?)(?<Key>someword)tanpa opsi regex ) mendapat data untuk setiap data / pasangan Key dan mengatur masing-masing dalam satu pertandingan.

Hasil

Berikut ini adalah hasil (untuk contoh kedua Anda) yang semuanya terkandung dalam pertandingan individu dan kelompok dan tangkapan mereka menyediakan di setiap pertandingan:

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

Secara visual inilah yang cocok:

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.