Ichida chiziq bo'lsa yoki bo'lmasa, n dan kamroq so'zlarni o'chiring

Ichida chiziq bo'lsa yoki bo'lmasa nima bo'lishidan qat'i nazar, kamida 4 ta belgidan iborat so'zlarni o'chirib tashlamoqchiman. Aytmoqchimanki :

Saqlamoq :

"Royaume-Uni"

"a B C D"

"ab-c"

O'chirish:

"a-b"

"abc"

"Ab-"

Men buni regexdan ko'ra qilaman: replaceAll ("\\ b [\\ w] {1,3} \\ b", "") ;

but for "Royaume-Uni"for example it gives : "Royaume-" and remove "Uni". I want to keep the entire word.

Qanday qilib so'zlarni 4 ta belgidan (matnni bitta belgi deb hisoblaysiz) olib tashlash va boshqalarni buzmasliklari mumkin?

1
Bundan tashqari, ixtiyoriy chiziqni olib tashlashni xohlaysizmi yoki faqat 4 ta belgidan kam bo'lmagan kalta so'zlarga e'tibor berish kerakmi, aniq emas
qo'shib qo'ydi muallif freedev, manba
"Bu chiziqcha g'amxo'rlik" bilan nimani nazarda tutasiz? Uni olib tashlashni xohlaysizmi yoki uni Uni ni olib tashlashni oldini olish kerak bo'lgan so'zni to'g'ri belgi deb bilasizmi?
qo'shib qo'ydi muallif Pshemo, manba
"Bu chiziqcha g'amxo'rlik" bilan nimani nazarda tutasiz? Uni olib tashlashni xohlaysizmi yoki uni Uni ni olib tashlashni oldini olish kerak bo'lgan so'zni to'g'ri belgi deb bilasizmi?
qo'shib qo'ydi muallif Pshemo, manba
Men yangilanishni amalga oshirdim, bu aniq emas, ayting.
qo'shib qo'ydi muallif YesWeStillCan, manba
Men yangilanishni amalga oshirdim, bu aniq emas, ayting.
qo'shib qo'ydi muallif YesWeStillCan, manba

8 javoblar

Ushbu regexni sinab ko'ring

(?<=^|[^\w-])[\w-]{1,3}(?=[^\w-]|$)

jonli demo -ga qarang.

Aslida \ b ishlamaydi, chunki shlyuzdan keyin bo'shlik \ b emas. Buning o'rniga, oldingi/keyingi belgilaringizni "tirelenmiş so'z chars" emas, yoki kirish boshi/oxiri deb tasdiqlash uchun atrofga qarashingiz mumkin.

0
qo'shib qo'ydi

So'z chegaralarini salbiy tomosha qilish yordamida o'zgartiring, chunki shpal - va harfni kiriting.

(?
0
qo'shib qo'ydi
@YesWeStillCan "Bu ish ko'rinadi" degani nimani anglatadi. Bu echim faqatgina ni 3 yoki undan kamroq belgilar o'chirib tashlashini oldini oladi, agar ular - bo'lsa, keyingi yoki keyingi so'zlar bilan qanday to'qnashuvlar bor. Iltimos, savolingizni yangilab turing va nima qilishni xohlayotganingizni aniqlang ("bu chiziqqa e'tibor bering" etarli darajada aniq emas). Siz nima olib tashlanishi kerakligini ko'rsatadigan ba'zi bir misollarni, nima bo'lmasligi kerakligini va nima uchun kerakligini o'z ichiga olishi mumkin.
qo'shib qo'ydi muallif Pshemo, manba
@YesWeStillCan Iltimos, ushbu ma'lumotni savolingizga qo'ying. Bundan tashqari, mantiqni aniqlang, chunki siz faqatgina ab-cd ni saqlamoqchi bo'lganingizni aytgan edingiz, lekin sizning savolingizga -Uni -Uni Shuningdek, sizning savolingiz qasddan yoki noto'g'riligini bildirmaydi va "bu chiziqqa g'amxo'rlik" uni aniqlashda bizga yordam bermaydi). Xo'sh, -Uni ni olib tashlashni istaysizmi, lekin -cd emas? Bu erda mantiq nima? Nimani olib tashlash kerakligi haqida qanday qaror qabul qilasiz?
qo'shib qo'ydi muallif Pshemo, manba
@Pshemo: Men yangilanish qildim. Faqatgina parametr - n belgilar va chiziqlar bir belgi sifatida qaraladi.
qo'shib qo'ydi muallif YesWeStillCan, manba
Menga aniqroq ruxsat ber. Aslida men to'rtta belgidan kam bo'lmagan har qanday so'zni o'chirib tashlamoqchiman. Shuning uchun "a-b" yoki "a-" yoki "-ba" yoki "abc" ni olib tashlashni xohlayman. Ammo "abcd" yoki "ab-CD" ni saqlashni xohlayman.
qo'shib qo'ydi muallif YesWeStillCan, manba
Bu ish ko'rinadi, rahmat. Ammo "a-b" kabi narsalar bilan uni ushlab turadi. Bu 4 harfdan kamroq harflar sifatida aniqlangan bo'lishi kerak va qanday qilib bunday qilish mumkin? "\ b (\ w- \ w) \ b" bu faqat 3 harf bilan ishlash uchun.
qo'shib qo'ydi muallif YesWeStillCan, manba

So'z chegaralarini salbiy tomosha qilish yordamida o'zgartiring, chunki shpal - va harfni kiriting.

(?
0
qo'shib qo'ydi
@YesWeStillCan "Bu ish ko'rinadi" degani nimani anglatadi. Bu echim faqatgina ni 3 yoki undan kamroq belgilar o'chirib tashlashini oldini oladi, agar ular - bo'lsa, keyingi yoki keyingi so'zlar bilan qanday to'qnashuvlar bor. Iltimos, savolingizni yangilab turing va nima qilishni xohlayotganingizni aniqlang ("bu chiziqqa e'tibor bering" etarli darajada aniq emas). Siz nima olib tashlanishi kerakligini ko'rsatadigan ba'zi bir misollarni, nima bo'lmasligi kerakligini va nima uchun kerakligini o'z ichiga olishi mumkin.
qo'shib qo'ydi muallif Pshemo, manba
@YesWeStillCan Iltimos, ushbu ma'lumotni savolingizga qo'ying. Bundan tashqari, mantiqni aniqlang, chunki siz faqatgina ab-cd ni saqlamoqchi bo'lganingizni aytgan edingiz, lekin sizning savolingizga -Uni -Uni Shuningdek, sizning savolingiz qasddan yoki noto'g'riligini bildirmaydi va "bu chiziqqa g'amxo'rlik" uni aniqlashda bizga yordam bermaydi). Xo'sh, -Uni ni olib tashlashni istaysizmi, lekin -cd emas? Bu erda mantiq nima? Nimani olib tashlash kerakligi haqida qanday qaror qabul qilasiz?
qo'shib qo'ydi muallif Pshemo, manba
@Pshemo: Men yangilanish qildim. Faqatgina parametr - n belgilar va chiziqlar bir belgi sifatida qaraladi.
qo'shib qo'ydi muallif YesWeStillCan, manba
Menga aniqroq ruxsat ber. Aslida men to'rtta belgidan kam bo'lmagan har qanday so'zni o'chirib tashlamoqchiman. Shuning uchun "a-b" yoki "a-" yoki "-ba" yoki "abc" ni olib tashlashni xohlayman. Ammo "abcd" yoki "ab-CD" ni saqlashni xohlayman.
qo'shib qo'ydi muallif YesWeStillCan, manba
Bu ish ko'rinadi, rahmat. Ammo "a-b" kabi narsalar bilan uni ushlab turadi. Bu 4 harfdan kamroq harflar sifatida aniqlangan bo'lishi kerak va qanday qilib bunday qilish mumkin? "\ b (\ w- \ w) \ b" bu faqat 3 harf bilan ishlash uchun.
qo'shib qo'ydi muallif YesWeStillCan, manba

O'zingizning matbuotdan oldin va keyin ixtiyoriy chiziqlarni ham e'tiborga olsangiz:

replaceAll("[-]*\\b[\\w]{1,3}\\b[-]*"," ");

https://www.regex101.com/r/eF5n3C/1

Boshqa tomondan, agar siz 4 ta belgidan kam bo'lgan, lekin avvalgi va oldingi chiziqlari bo'lmagan barcha so'zlarni moslashtirmoqchi bo'lsangiz, avvalgi va keyingi regex atrofiga qarashingiz kerak.

0
qo'shib qo'ydi

O'zingizning matbuotdan oldin va keyin ixtiyoriy chiziqlarni ham e'tiborga olsangiz:

replaceAll("[-]*\\b[\\w]{1,3}\\b[-]*"," ");

https://www.regex101.com/r/eF5n3C/1

Boshqa tomondan, agar siz 4 ta belgidan kam bo'lgan, lekin avvalgi va oldingi chiziqlari bo'lmagan barcha so'zlarni moslashtirmoqchi bo'lsangiz, avvalgi va keyingi regex atrofiga qarashingiz kerak.

0
qo'shib qo'ydi

\b represent place which is

  • between alphanumeric (including _) and non-alphanumeric characters
  • at start or end of your string

Ya'ni, -U bo'lsa, u ( - ) - | U tomonidan ko'rsatilgan joyga mos keladi. Agar siz qo'ng'iroqlarni bo'sh joy va bo'sh joy belgilariga asoslantirmoqchi bo'lsangiz, u holda \ b foydalana olmaysiz. Aksincha, atrofiga qarash kabi mexanizmlarni ishlatishingiz kerak

  • (?<=\s|^) to check if your word has space or start of the string before it,
  • (?=\s|$) to check if your word has space or end of the string after it.

Bundan tashqari, {1, 3} belgilarning bir qismi sifatida - ni ko'rib chiqish uchun \ w va - [\ w -] (odatda - ) sifatida ifodalanadi, chunki u az kabi belgilar oralig'ini yaratish uchun ishlatilishi mumkin, chunki bu erda biz bunday masofani ifodalash uchun ishlatilmaymiz, bundan qochishimiz shart emas).

Shunday qilib, hal qilishingiz mumkin:

replaceAll("(?<=\\s|^)[\\w-]{1,3}(?=\\s|$)","");
0
qo'shib qo'ydi
Yaxshi ideone.com/tSzZFa ishlaydigan ko'rinadi. Faqat bitta joyda $ ^ ni o'zgartirish kerak.
qo'shib qo'ydi muallif Pshemo, manba
Ajoyib! Sizning mahoratingiz uchun tashakkur.
qo'shib qo'ydi muallif YesWeStillCan, manba
Rahmat. U 3 belgidan ko'proq so'zlarni ushlab turadi, biroq "a-b" "-ab" yoki "ab-" ni saqlaydi. Qochgan chiziq xuddi shu natijani keltiradi. Qanday qilib biz 3 ta belgidan iborat so'zlarni olib tashlashimiz mumkin?
qo'shib qo'ydi muallif YesWeStillCan, manba

Siz buni quyidagi (oddiy) dan foydalanishingiz mumkin:

replaceAll("\\b-?\\w{1,3}\\b", " ");

DEMO

0
qo'shib qo'ydi

Siz buni quyidagi (oddiy) dan foydalanishingiz mumkin:

replaceAll("\\b-?\\w{1,3}\\b", " ");

DEMO

0
qo'shib qo'ydi