Obsługa rosyjskiego alfabetu w Regex

0

Cześć, moim zadaniem jest napisanie wyrażenia regularnego:
"identyfikator czyli ciąg liter i cyfr zaczynający się od litery, kończący się znakiem nie
będącym ani literą ani cyfrą (ten znak kończący nie należy już do identyfikatora)"
Chciałbym rozbudować zadanie o obsługę cyrylicy, i pomimo usilnych starań, mój wzór nie rozpoznaje rosyjskich liter. Czy jest ktoś w stanie powiedzieć mi w jaki sposób to zrobić, żeby działało poprawnie?
Mój wyjściowy wzór wygląda następująco: (obsługa TYLKO łacińskiego alfabetu)
screenshot-20201111002857.png
Wzór "rozbudowany": (niedziałający)
screenshot-20201111003028.png

Zadanie jest wykonywane na stronie: https://regexr.com/

PS. jeśli nieprawidłowy dział, proszę o przeniesienie. To mój pierwszy post ;)

2
  1. Musisz włączyć obsługę Unikodu
  2. Musisz użyć kategorii znakowych Unikodu

W ostateczności lądujesz z:

/\b\{L}\w*\b/gu
0

A ty tam na pewno użyłeś ruskiego A?
Mi wyrażenie regularne:

([А-Яа-я]){2,}

działa bez zarzutów na https://regexr.com/ i matchuje оборотное z tekstu:

Edit the Expression & Text to see matches. Roll over matches or the expression for details. PCRE & JavaScript flavors of RegEx are supported. Validate your expression with Tests mode.
э оборотное
The side bar includes a Cheatsheet, full Reference, and Help. You can also Save & Share with the Community, and view patterns you create or favorite in My Patterns.

Pytanie czy jest to poprawny regex? Okazuje się że NIE. Podobnie jak a-z nie zmaczuje ą i ę, tak samo а-я nie zmaczuje małego Ё, bo znak ten ma przypisany kod unicode z poza zakresu (U+0410 - U+042F). Na stronie https://en.wikipedia.org/wiki/Russian_alphabet można podejrzeć kody Unicode przypisane poszczególnym literom.

Niestety składnia Regex jest tutaj niestandardowa i wiele języków definiuje ją po swojemu. https://stackoverflow.com/questions/1716609/how-to-match-cyrillic-characters-with-a-regular-expression podaje trzy najbardziej popularne warianty poprawnych regexów...

Z \p{L} należy być bardzo ostrożnym bo maczuje wszystko co ma oznaki litery w Unicode a więc np. インフィニット・ストラトス :D

2

@0xmarcin: ([А-Яа-я]){2,} Używanie literałów spoza alfabetu łacińskiego jest zdradliwe ze względu na obsługę unikodu (regex ma tu niewiele do powiedzenia). W Javie dobrze jest używać po prostu kodów. Dla języka polskiego to się sprawdza. Z rosyjskim jest większy problem, jeśli jest w tym samym stringu mieszany z innymi alfabetami., czyli np. [\u0416]{2}

1 użytkowników online, w tym zalogowanych: 0, gości: 1