Боюсь, что 1000
\b
ориентирован на английский язык, и на самом деле он не очень хорош даже для того, чтобы ориентироваться на английский.:-) (Например, в конце «English» в «English-centric» он будет совпадать.)
Вы можете использовать обходные пути с отрицательной категорией Unicode «letter» для проверки границ слов.Эти функции присутствуют в самой последней спецификации JavaScript, но поддержка очень слабая.Вы можете бросить в него библиотеку, хотя: XRegExp
от Стивена Левитана:
var str ="آپ کا نام کیا ہے؟";
var rex = XRegExp("(?<=^|[^\\p{Letter}])آپ(?=$|[^\\p{Letter}])", "g");
var res = str.replace(rex, "aap");
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.min.js"></script>
В этом регулярном выражении:
(?<=^|[^\p{Letter}])
- это средство для начала ввода или не буква встандарт Юникод.(Обратите внимание, что \
должен быть экранирован внутри строки, которую мы передаем XRegExp
, поэтому XRegExp
получает его, поскольку \
- это экранирование в строковых литералах.) آپ
- этослово (?=$|[^\p{Letter}])
- это прогноз конца ввода или не буквы.(Опять же, с \
в строке.)
Как я уже упоминал в моем комментарии , из-за справа налево (RTL) против левогоразличие языкового скрипта (справа налево) (например, арабский алфавит или латинский алфавит), которое отображается как aap کا نام کیا ہے؟
, а не как ожидаемый результат, даже если текст был заменен в нужном месте, потому что слово урдув начале строки (но при визуализации весь арабский алфавит выводится справа налево).Таким образом, в обновленной строке латинский алфавит (app
) выводится слева направо, а затем арабский - справа налево.
В действительно вверх-современный движок JavaScript, вы можете сделать это изначально:
var str ="آپ کا نام کیا ہے؟";
var rex = /(?<=^|[^\p{Letter}])آپ(?=$|[^\p{Letter}])/g;
var res = str.replace(rex, "aap");
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.min.js"></script>
Это работает, например, в версии V8 в Chrome v75 и Node.js v12.4.
(Примечание: сXRegExp
, вы могли бы использовать сокращение \pL
вместо \p{Letter}
, но не с собственными регулярными выражениями JavaScript.)