Saya menggunakan regex Java di Java 1.6 (untuk mengurai output numerik, antara tujuan lain) dan tidak dapat menemukan definisi yang tepat dari \b
("batas kata"). Saya berasumsi bahwa itu -12
akan menjadi "kata integer" (cocok dengan \b\-?\d+\b
) tetapi tampaknya ini tidak berhasil. Saya akan berterima kasih mengetahui cara-cara mencocokkan angka-angka yang dipisahkan ruang.
Contoh:
Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());
Ini mengembalikan:
true
false
true
regex
word-boundary
peter.murray.rust
sumber
sumber
Jawaban:
Batas kata, dalam sebagian besar dialek regex, adalah posisi antara
\w
dan\W
(karakter non-kata), atau di awal atau akhir string jika dimulai atau diakhiri (masing-masing) dengan karakter kata ([0-9A-Za-z_]
).Jadi, dalam string
"-12"
, itu akan cocok sebelum 1 atau setelah 2. Tanda hubung bukan karakter kata.sumber
\b
adalah pernyataan nol-lebar yang cocok jika ada\w
di satu sisi, dan ada\W
di sisi lain atau posisi awal atau akhir string.\w
secara sewenang-wenang didefinisikan sebagai karakter "pengidentifikasi" (alnum dan garis bawah), bukan sebagai sesuatu yang sangat berguna untuk bahasa Inggris.\bhello\b
tanpa menggunakan\b
(menggunakan\w
,\W
dan lainnya)?(^|\W)hello($|\W)
:, kecuali bahwa itu tidak akan menangkap karakter non-kata sebelum dan sesudah, jadi itu akan lebih seperti(^|(?<=\W))hello($|(?=\W))
(menggunakan lookahead / lookbehind assertions).(?<!\w)hello(?!\w)
.Batas kata dapat muncul di salah satu dari tiga posisi:
Karakter kata bersifat alfanumerik; tanda minus tidak. Diambil dari Regex Tutorial .
sumber
Dalam proses belajar ekspresi reguler, saya benar-benar terjebak dalam metacharacter yang ada
\b
. Saya memang tidak mengerti artinya ketika saya bertanya pada diri sendiri " apa itu, apa itu " berulang-ulang. Setelah beberapa upaya dengan menggunakan situs web , saya menonton garis vertikal merah muda di setiap awal kata dan di akhir kata. Saya mengerti artinya pada saat itu. Sekarang persis kata (\w
) -batas .Pandangan saya hanya berorientasi pada pemahaman. Logika di balik itu harus diperiksa dari jawaban lain.
sumber
Batas kata adalah posisi yang didahului oleh karakter kata dan tidak diikuti oleh kata, atau diikuti oleh karakter kata dan tidak didahului oleh karakter.
sumber
Saya berbicara tentang apa-
\b
batas gaya regex sebenarnya di sini .Cerpennya adalah bahwa mereka bersyarat . Perilaku mereka tergantung pada apa yang akan mereka lakukan selanjutnya.
Terkadang bukan itu yang Anda inginkan. Lihat jawaban saya yang lain untuk penjelasan.
sumber
Saya ingin menjelaskan jawaban Alan Moore
Misalkan saya punya string "Ini adalah sebuah c sebuah t, dan dia seorang wesome", dan saya seharusnya untuk mengganti semua kejadian (s) huruf 'a' hanya jika surat ini ada di "Batas dari sebuah kata" , yaitu huruf
a
di dalam 'cat' tidak boleh diganti.Jadi saya akan melakukan regex (dengan Python ) sebagai
re.sub("\ba","e", myString.strip())
// gantia
dengane
sehingga output akan ini adalah
e
c sebuah te
nd dia inie
wesomesumber
Aku berlari ke masalah lebih buruk ketika mencari teks untuk kata-kata seperti
.NET
,C++
,C#
, danC
. Anda akan berpikir bahwa pemrogram komputer akan tahu lebih baik daripada memberi nama bahasa sesuatu yang sulit untuk menulis ekspresi reguler.Bagaimanapun, ini adalah apa yang saya temukan (dirangkum sebagian besar dari http://www . regular-expressions.info , yang merupakan situs yang hebat): Dalam kebanyakan rasa regex, karakter yang cocok dengan kelas karakter tangan pendek
\w
adalah karakter yang diperlakukan sebagai karakter kata dengan batas kata. Java adalah pengecualian. Java mendukung Unicode untuk\b
tetapi tidak untuk\w
. (Saya yakin ada alasan bagus untuk itu pada saat itu).The
\w
singkatan dari "karakter kata". Itu selalu cocok dengan karakter ASCII[A-Za-z0-9_]
. Perhatikan dimasukkannya garis bawah dan digit (tetapi tidak putus-putus!). Dalam sebagian besar rasa yang mendukung Unicode,\w
sertakan banyak karakter dari skrip lain. Ada banyak ketidakkonsistenan tentang karakter mana yang sebenarnya dimasukkan. Huruf dan angka dari skrip alfabet dan ideograf umumnya disertakan. Tanda baca konektor selain simbol garis bawah dan angka yang bukan digit mungkin atau mungkin tidak disertakan. Skema XML dan XPath bahkan menyertakan semua simbol di\w
. Tetapi Java, JavaScript, dan PCRE hanya cocok dengan karakter ASCII\w
.Itulah sebabnya pencarian regex berbasis Java untuk
C++
,C#
atau.NET
(bahkan ketika Anda ingat untuk keluar dari periode dan plus) dikacaukan oleh\b
.Catatan: Saya tidak yakin apa yang harus dilakukan tentang kesalahan dalam teks, seperti ketika seseorang tidak memberi spasi setelah periode di akhir kalimat. Saya mengizinkannya, tetapi saya tidak yakin itu hal yang tepat untuk dilakukan.
Bagaimanapun, di Jawa, jika Anda mencari teks untuk bahasa-bahasa aneh, Anda harus mengganti
\b
dengan sebelum dan sesudah spasi putih dan tanda baca. Sebagai contoh:Kemudian dalam tes atau fungsi utama Anda:
PS Terima kasih saya kepada http://regexpal.com/ tanpa siapa dunia regex akan sangat menyedihkan!
sumber
C#
tetapi sekarang lebih jelasLihat dokumentasi tentang syarat batas:
http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html
Lihat contoh ini:
Ketika Anda mencetaknya, perhatikan bahwa hasilnya adalah ini:
[Saya menemukan nilai -, dalam string saya.]
Ini berarti bahwa karakter "-" tidak diambil sebagai berada pada batas kata karena itu tidak dianggap sebagai karakter kata. Sepertinya @brianary agak mengalahkan saya, jadi dia mendapat suara.
sumber
Batas kata \ b digunakan di mana satu kata harus berupa karakter kata dan yang lain merupakan karakter non-kata. Ekspresi Reguler untuk angka negatif seharusnya
periksa DEMO yang berfungsi
sumber
Saya percaya bahwa masalah Anda disebabkan oleh fakta bahwa
-
bukan karakter kata. Dengan demikian, kata batas akan cocok setelah-
, dan dengan demikian tidak akan menangkapnya. Batas kata cocok sebelum karakter kata pertama dan setelah kata terakhir dalam sebuah string, serta tempat di mana sebelumnya adalah karakter kata atau karakter non-kata, dan setelah itu adalah kebalikannya. Perhatikan juga bahwa batas kata adalah kecocokan dengan lebar nol.Salah satu alternatif yang mungkin adalah
Ini akan cocok dengan angka apa pun yang dimulai dengan karakter spasi dan tanda hubung opsional, dan berakhir pada batas kata. Ini juga akan cocok dengan angka yang dimulai pada awal string.
sumber
Saya pikir itu adalah batas (yaitu karakter yang mengikuti) dari pertandingan terakhir atau awal atau akhir dari string.
sumber
\G
: cocok dengan awal string (seperti\A
) pada upaya pertandingan pertama; setelah itu cocok dengan posisi di mana pertandingan sebelumnya berakhir.ketika Anda menggunakan
\\b(\\w+)+\\b
itu berarti sama persis dengan kata yang hanya mengandung karakter kata([a-zA-Z0-9])
dalam kasus Anda misalnya pengaturan
\\b
pada awal regex akan menerima-12
(dengan spasi) tetapi sekali lagi itu tidak akan menerima-12
(tanpa spasi)untuk referensi untuk mendukung kata-kata saya: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html
sumber