Dapatkah saya menggunakan OR dalam regex tanpa menangkap apa yang disertakan?

115

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.

goggin13
sumber
Bagus satu +1 untuk tautan ke rubular
bukowski

Jawaban:

181

Bergantung pada implementasi ekspresi reguler, Anda dapat menggunakan apa yang disebut grup non-capturing dengan sintaks (?:…):

((?:a|b)c)

Ini (?:a|b)adalah grup tetapi Anda tidak dapat merujuk kecocokannya. Jadi, Anda hanya dapat mereferensikan kecocokan ((?:a|b)c)itu acatau bc.

Gumbo
sumber
berhasil! Terima kasih atas tanggapannya yang super cepat. Saya akan menerima setelah batas waktu (yang saya tidak tahu ada) berakhir.
goggin13
4
Saya pikir idenya bukan untuk menangkap aatau bsama sekali. Dengan kata lain, untuk mencocokkan ac atau bc, tetapi hanya menangkap yang c:(?:a|b)(c)
Alan Moore
1
@AlanMoore Apakah mungkin untuk menangkap satu dan bukan yang lain dalam pernyataan atau? Jadi saya mencari pola acatau ab, tapi saya ingin mengeluarkan abjika abdan hanya 'c' adalah keluarannya adalah 'ac'.
Moondra
24

Jika implementasi Anda memilikinya, Anda dapat menggunakan tanda kurung non-capturing:

(?:a|b)
Marc Mutz - mmutz
sumber
@mmutz Terima kasih atas tanggapan yang cepat! Saya berharap saya dapat menerima kedua jawaban, itulah yang saya cari
goggin13
3

Bahkan rubular tidak mengharuskan Anda menggunakan tanda kurung dan diutamakan dari |rendah. Misalnya a | bc tidak cocok dengan ccc

msw
sumber
apa yang dilakukan operator '! ~'? Saya suka ekspresi Anda, dengan lebih sedikit parens, regex sudah cukup berantakan
goggin13
! ~ adalah perlisme untuk "tidak cocok", tulisan saya ceroboh; diperbaiki, terima kasih.
msw
2
Saya tidak mengerti. Didahulukan rendah |adalah mengapa Anda tidak harus menggunakan parens. (?:a|b)ccocok acatau bc(perilaku yang diinginkan), saat a|bccocok aatau bc.
Alan Moore
2

Jika alternatif ATAU Anda semuanya adalah karakter tunggal - Anda dapat menggunakan operator "kumpulan karakter":

([ab]c)

itu hanya akan cocok acatau bcdan itu lebih mudah dibaca.

yrtimiD
sumber