Замените слова урду из строки в Nodejs - PullRequest
3 голосов
/ 29 июня 2019

Я хочу выполнить операции замены строки над словами на языке урду, но следующий код не заменяет آپ на aap.Я использую границы слов, чтобы заменить целые слова, а не части слов.

var str ="آپ کا نام کیا ہے؟";
var res = str.replace(/\bآپ\b/g, "aap");
console.log(res);

Ожидается следующий вывод:

 کا نام کیا ہے؟ aap

Ответы [ 3 ]

2 голосов
/ 29 июня 2019
Боюсь, что 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.)

2 голосов
/ 29 июня 2019

Попробуйте без \ b, вот так

var str ="آپ کا نام کیا ہے؟";
   var res = str.replace(/(^|\s)آپ(?=\s|$)/g, "aap");
console.log(res);
0 голосов
/ 29 июня 2019

Я не уверен, если это выражение,

(?=\s|)(آپ)(?=\s|$)

может быть близко к тому, что мы могли бы хотеть здесь, но, возможно, это был бы вариант.

В этом демо , объяснение объяснено.

Тест

const regex = /(?=\s|)(آپ)(?=\s|$)/gm;
const str = `آپ
آپ کا نام کیا ہے؟
آپ کا نام کیا ہے؟ آپ کا نام کیا ہے؟
آپکاآپکا نام کیا ہے؟آپکا نام کیا ہے؟`;
const subst = `app`;

console.log(str.replace(regex, subst));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...