Jika Anda hanya perlu mendapatkan apa pun di antara keduanya []
, Anda dapat menggunakan \[([^\]]*)\]
seperti ini:
Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
result = m.group();
}
Jika Anda membutuhkannya dalam bentuk, identifier + [ + content + ]
Anda dapat membatasi ekstraksi konten hanya jika pengenalnya adalah alfanumerik:
[a-zA-Z][a-z-A-Z0-9_]*\s*\[([^\]]*)\]
Ini akan memvalidasi hal-hal seperti Foo [Bar]
, atau myDevice_123["input"]
misalnya.
Isu utama
Masalah utamanya adalah ketika Anda ingin mengekstrak konten dari sesuatu seperti ini:
FOO[BAR[CAT[123]]+DOG[FOO]]
Regex tidak akan berfungsi dan akan kembali BAR[CAT[123
dan FOO
.
Jika kita mengubah Regex menjadi \[(.*)\]
maka kita baik-baik saja tetapi kemudian, jika Anda mencoba mengekstrak konten dari hal-hal yang lebih kompleks seperti:
FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]
Tak satu pun dari Regex akan berfungsi.
Regex paling akurat untuk mengekstrak konten yang tepat dalam semua kasus akan jauh lebih kompleks karena perlu menyeimbangkan []
pasangan dan memberi Anda konten.
Solusi yang lebih sederhana
Jika masalah Anda semakin kompleks dan konten []
arbitrer, Anda dapat menyeimbangkan pasangan []
dan mengekstrak string menggunakan kode lama biasa daripada Regex:
int i;
int brackets = 0;
string c;
result = "";
for (i = input.indexOf("["); i < str.length; i++) {
c = str.substring(i, i + 1);
if (c == '[') {
brackets++;
} else if (c == ']') {
brackets--;
if (brackets <= 0)
break;
}
result = result + c;
}
Ini lebih banyak pseudo-code daripada kode asli, saya bukan pembuat kode Java jadi saya tidak tahu apakah sintaksnya benar, tetapi seharusnya cukup mudah untuk diperbaiki.
Yang penting adalah kode ini harus berfungsi dan memungkinkan Anda mengekstrak konten []
, betapapun rumitnya itu.