#javascript #regex
#javascript #регулярное выражение
Вопрос:
У меня есть следующее регулярное выражение, соответствующее арабским буквам. Я хотел бы также принять следующие символы, символы ,.()-
и символы пробела, однако прямо сейчас он использует логическое значение или между группами, арабская буква должна быть обязательной, поэтому она не будет принимать, например, только пробел или любой из символов, перечисленных выше.
Не должны совпадать символы без арабских букв
,()-
Должно соответствовать
.()-,سشييتنسشاي
سشييتنسشاي.(ي)-,
^([u0600-u06ff]|[u0750-u077f]|[ufb50-ufbc1]|[ufbd3-ufd3f]|[ufd50-ufd8f]|[ufd92-ufdc7]|[ufe70-ufefc]|[ufdf0-ufdfd])*$
Ответ №1:
Если я правильно читаю, правила следующие:
- Должен содержать хотя бы один символ в арабском алфавите
- Должно состоять только из арабского шрифта, пробелов и
,.()-
Если это так, вы хотите:
- Позитивный прогноз для арабского символа где-нибудь в строке в сочетании с
^
и$
якоря, требующие, чтобы все между ними было арабским или.,()-
или пробелом
Если это так, вы можете сделать это с помощью экранирования свойств Unicode (ES2018 , поддерживается в современных версиях Firefox, Chrome / Chromium, Safari, Brave и Edge [v79 ]; или вы можете использовать библиотеки, такие как http://xregexp.com /):
const rex = /^(?=.*?p{Script_Extensions=Arabic})[- ().,p{Script_Extensions=Arabic}] $/u;
Живой пример:
const rex = /^(?=.*?p{Script_Extensions=Arabic})[- ().,p{Script_Extensions=Arabic}] $/u;
const shouldNotMatch = [" ", ",()-"];
const shouldMatch = ["سشييتنسشاي", ".()-,سشييتنسشاي", "سشييتنسشاي.(ي)-,"];
for (const str of shouldNotMatch) {
const result = rex.test(str);
console.log(str, result, result ? "ERROR" : "Good");
}
for (const str of shouldMatch) {
const result = rex.test(str);
console.log(str, result, result ? "Good" : "ERROR");
}
Комментарии:
1. FWIW, я расскажу о различных улучшениях Юникода в JavaScript за последние несколько лет в главах 10 и 15 моей новой книги » JavaScript: новые игрушки «. Ссылки в моем профиле, если вам интересно.