Saya menggunakan rubular.com untuk membuat regex saya, dan dokumentasinya menjelaskan hal berikut:
(...) Capture everything enclosed
(a|b) a or b
Bagaimana saya bisa menggunakan ekspresi OR tanpa menangkap apa yang ada di dalamnya? Misalnya, saya ingin menangkap "ac" atau "bc". Saya tidak bisa menggunakan regex
(a|b)(c)
Baik? Sejak itu saya menangkap "a" atau "b" dalam satu grup dan "c" di grup lain, tidak sama. Saya tahu saya bisa memfilter melalui hasil yang diambil, tetapi sepertinya lebih berhasil ...
Apakah saya melewatkan sesuatu yang jelas? Saya menggunakan ini di Jawa, jika itu relevan.
regex
capture
regex-group
goggin13
sumber
sumber
Jawaban:
Bergantung pada implementasi ekspresi reguler, Anda dapat menggunakan apa yang disebut grup non-capturing dengan sintaks
(?:…)
:Ini
(?:a|b)
adalah grup tetapi Anda tidak dapat merujuk kecocokannya. Jadi, Anda hanya dapat mereferensikan kecocokan((?:a|b)c)
ituac
ataubc
.sumber
a
ataub
sama sekali. Dengan kata lain, untuk mencocokkanac
ataubc
, tetapi hanya menangkap yangc
:(?:a|b)(c)
ac
atauab
, tapi saya ingin mengeluarkanab
jikaab
dan hanya 'c' adalah keluarannya adalah 'ac'.Jika implementasi Anda memilikinya, Anda dapat menggunakan tanda kurung non-capturing:
sumber
Bahkan rubular tidak mengharuskan Anda menggunakan tanda kurung dan diutamakan dari
|
rendah. Misalnya a | bc tidak cocok dengan cccsumber
|
adalah mengapa Anda tidak harus menggunakan parens.(?:a|b)c
cocokac
ataubc
(perilaku yang diinginkan), saata|bc
cocoka
ataubc
.Jika alternatif ATAU Anda semuanya adalah karakter tunggal - Anda dapat menggunakan operator "kumpulan karakter":
itu hanya akan cocok
ac
ataubc
dan itu lebih mudah dibaca.sumber