Подтвердить что ты не робот

Javascript - регулярное выражение - граница слова (\ b)

У меня есть проблема с использованием \b и греческих символов в регулярном выражении.

В в этом примере [a-zA-ZΆΈ-ώἀ-ῼ]* удается отметить все слова, которые я хочу (как греческие, так и английские). Теперь подумайте, что я хочу найти слова с двумя буквами. Для английского языка я использую нечто вроде this: \b[a-zA-Z]{2}\b. Можете ли вы помочь мне написать регулярное выражение, которое позволяет пометить слова на греческом языке двумя буквами? (Почему? Моя конечная цель - удалить их).

используемый текст:

Греческий MONOTONIC: Το γάρ ούν και παρ 'υμίν λεγόμενον, ώς ποτε Φαέθων Ηλίου παίς το του πατρός άρμα ζεύξας δια το μή δυνατός είναι κατά την του πατρός οδόν ελαύνειν τα τ' επί της γής ξυνέκαυσε και αυτός κεραυνωθείς διεφθάρη, τούτο μύθου μέν σχήμα έχον λέγεται, το δέ αληθές εστι των περί γήν και κατ 'ουρανόν ιόντων παράλλαξις και διά μακρόν χρόνον γιγνομένη των επί γής πυρί πολλώ φθορά.

Греческий ПОЛИТОНИК: Τὸ γὰρ οὖν καὶ παρ 'ὑμῖν λεγόμενον, ὥς ποτε Φαέθων Ἡλίου παῖς τὸ τοῦ πατρὸς ἅρμα ζεύξας διὰ τὸ μὴ δυνατὸς εἶναι κατὰ τὴν τοῦ πατρὸς ὁδὸν ἐλαύνειν τὰ τ' ἐπὶ τῆς γῆς ξυνέκαυσε καὶ αὐτὸς κεραυνωθεὶς διεφθάρη, τοῦτο μύθου μὲν σχῆμα ἔχον λέγεται, τὸ δὲ ἀληθές ἐστι τῶν περὶ γῆν καὶ κατ 'οὐρανὸν ἰόντων παράλλαξις καὶ διὰ μακρὸν χρόνον γιγνομένη τῶν ἐπὶ τῆς γῆς πυρὶ πολλῷ φθορά.

АНГЛИЙСКИЙ: Ибо, по правде говоря, история, рассказанная в вашей стране, а также наша, как когда-то Фаэтон, сын Гелиоса, возил свою колесницу отца и, поскольку он не мог прогнать ее по ходу, проведенному отцом, сожжен все, что было на земле, и сам погиб от молнии, - эта история, как сказано, имеет моду легенды, но истина заключается в возникновении смещения тел на небесах, которые движутся вокруг земли, и разрушение вещей на земле ожесточенным огнем, которое повторяется с большими интервалами.

, что я пробовал до сих пор:

// 1
txt = txt.replace(/\b[a-zA-ZΆΈ-ώἀ-ῼ]{2}\b/g, '');

// 2
tokens = txt.split(/\s+/);
txt = tokens.filter(function(token){ return token.length > 2}).join(' ');

// 3
tokens = txt.split(' ');
txt = tokens.filter(function(token){ return token.length != 3}).join(' ') );

2 и 3 были предложены на мой вопрос здесь: Javascript - regex - как удалить слова с указанной длиной

ИЗМЕНИТЬ

Читайте также:

4b9b3361

Ответ 1

Поскольку Javascript не имеет функции lookbehind, и поскольку границы слов работают только с членами класса символов \w, единственный способ - использовать группы (и захватить группы, если вы хотите сделать замену):

(?m)(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])

пример для удаления двух букв:

txt = txt.replace(/(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])/gm, '\1');

Ответ 2

Вы можете использовать \S

Вместо того, чтобы писать совпадение для "символов слова плюс эти символы", может быть целесообразно использовать регулярное выражение, которое соответствует не-пробелу:

\S

Он шире по объему, но проще писать/использовать.

Если это слишком широко - используйте эксклюзивный список, а не список, содержащий список:

[^\s\.]

То есть - любой символ, который не является пробелом, а не точкой. Таким образом, это также легко добавить к исключениям.

Не пытайтесь использовать \b

Границы Word не работают с символами none-ascii, которые легко продемонстрировать:

> "yay".match(/\b.*\b/)
["yay"]
> "γaγ".match(/\b.*\b/)
["a"]

Поэтому не удается использовать \b для обнаружения слов с греческими символами - каждый символ является совпадающей границей.

Символьные слова 2-го слова

В соответствии с двумя символьными словами можно использовать следующий шаблон:

pattern = /(^|[\s\.,])(\S{2})(?=$|[\s\.,])/g;

(Точнее: для сопоставления двух последовательностей без пробелов).

То есть:

(^|[\s\.,]) - start of string or whitespace/punctuation (back reference 1)
(\S{2})     - two not-whitespace characters (back reference 2)
($|[\s\.,]) - end of string or whitespace/punctuation (positive lookahead)

Этот шаблон можно использовать так, чтобы удалить соответствующие слова:

"input string".replace(pattern);

Здесь jsfiddle, демонстрирующий использование шаблонов в текстах в вопросе.

Ответ 3

Попробуйте что-то вроде этого:

\s[a-zA-ZΆΈ-ώἀ-ῼ]{2}\s