informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Dalam ekspresi reguler,? Dapat mewakili kuantitas, 0 atau 1 kali, setara dengan {0, 1}, atau dapat digunakan sebagai karakter khusus untuk mewakili makna lainnya.
? diikuti oleh kualifikasi kuantitas lainnya menunjukkan kecocokan yang tidak serakah, yaitu mencocokkan string terpendek yang dicari.
Mari kita lihat sebuah contoh:
- @Test
- public void test() {
- Pattern pattern = Pattern.compile("a.*?");
- Matcher matcher = pattern.matcher("abcabc");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- }
- }
Output setelah eksekusi: abcabc
Bukankah ini pertandingan terpendek? Mengapa gagal?
Ini sebenarnya melibatkan aturan pencocokan yang tidak serakah:Pencocokan non-serakah, jalur terpendek dicocokkan sebelum aturan berikutnya. Jika tidak ada aturan berikutnya, maka diproses sebagai pencocokan serakah.
Artinya, jika hanya "a.*?" yang muncul, maka akan tetap diproses sesuai dengan pencocokan serakah.
Mari kita lihat penggunaan yang benar:
- @Test
- public void test() {
- Pattern pattern = Pattern.compile("(a.*?)(.*)");
- Matcher matcher = pattern.matcher("afcafc");
- if (matcher.matches()) {
- System.out.println(matcher.group(0));
- System.out.println(matcher.group(1));
- System.out.println(matcher.group(2));
- }
- }
Output setelah eksekusi:
- afcafc
- a
- fcafc
Seperti yang Anda lihat, grup penangkap pertama menangkap string terpendek "a", dan grup penangkap kedua menangkap "fcafc".
Mari kita lihat dua situasi lainnya:
Saat digunakan dalam grup penangkap, ?: ditempatkan sebelum ekspresi reguler untuk menunjukkan kecocokan tetapi tidak menangkap, artinya grup nilai pencocokan ini tidak dapat diperoleh melalui metode grup.
Mari kita lihat sebuah contoh
- @Test
- public void test0() {
- Pattern pattern = Pattern.compile("\d{4}-(?:[a-z]+)");
- Matcher matcher = pattern.matcher("3214-opo");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- System.out.println(matcher.group(1)); // 报错
- }
- }
Kesalahan akan dilaporkan saat menangkap melalui grup(1), yaitu dapat dicocokkan, tetapi tidak dapat ditangkap. Jika ?: dihapus, grup(1) dapat digunakan untuk menangkap secara normal.
(?s) mengaktifkan mode satu baris di sisi kanan, membuat .cocok dengan karakter apa pun, termasuk karakter baris baru n.
Mari kita lihat sebuah contoh:
- private static final String DEFAULT_VARIABLE_PATTERN = "((?s).*)";
-
-
- /**
- * 从输出结果可知,匹配到了换行符 'n'
- */
- @Test
- public void test4() {
- Pattern pattern = Pattern.compile(DEFAULT_VARIABLE_PATTERN);
- Matcher matcher = pattern.matcher("abcnsdf");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- System.out.println(matcher.group(1));
- System.out.println(matcher.group(2)); // (?s) 不能作为捕获组,报错
- }
- }
Saat menangkap, (?s) tidak dapat ditangkap sebagai grup penangkap, jadi "((?s).*)" paling banyak dapat menangkap grup(1), dan kesalahan akan dilaporkan saat menangkap grup(2).
- @Test
- public void test5() {
- Pattern pattern = Pattern.compile("(.*)");
- Matcher matcher = pattern.matcher("abcnsdf");
- if (matcher.matches()) {
- System.out.println(matcher.group());
- System.out.println(matcher.group(1));
- }
- }
Setelah menghapus (?s), coba cocokkan dengan "abcnsdf". Karena ada karakter baris baru, pencocokan tidak dapat diselesaikan, jadi tidak ada output.