从Node.js中的字符串替换乌尔都语单词

时间:2019-06-29 09:05:36

标签: javascript regex string unicode replace

我想对乌尔都语单词执行替换字符串操作,但是以下代码未将آپ替换为aap。我正在使用单词边界,以便它代替整个单词而不是单词的各个部分。

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

我期望以下输出:

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

3 个答案:

答案 0 :(得分:2)

尝试不使用\ b,就像这样

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

答案 1 :(得分:2)

恐怕

\b是以英语为中心的,即使以英语为中心,实际上也不是那么擅长。 :-)(例如,它将在“以英语为中心”的“英语”末尾匹配。)

您可以将环视与否定的Unicode“字母”类别一起使用,以检查单词边界。这些功能存在于最新的JavaScript规范中,但支持非常差。不过,您可以向它扔一个库:XRegExp,作者:史蒂文·莱维森(Steven Levithan):

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}])是根据Unicode标准开始输入或输入后的非字母。 (请注意,\必须在我们传递的XRegExp字符串内进行转义,因为XRegExp是字符串文字中的转义,因此\会收到它。)
  • آپ是这个词
  • (?=$|[^\p{Letter}])是输入结束或非字母前瞻。 (再次,\在字符串中转义。)

正如我在my comment中所提到的,由于从右到左(RTL)与从左到右(LTR)语言脚本的不同(例如,阿拉伯语脚本与拉丁语脚本),即使文本在正确的位置被替换,它也以aap کا نام کیا ہے؟而不是您的预期输出,因为Urdu字在字符串的开头(但是在呈现时,所有阿拉伯语脚本都是从右边输出的,向左)。因此,在更新的字符串中,从左至右输出拉丁字母(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>

例如,在Chrome v75和Node.js v12.4中的V8版本中有效。

(附带说明:使用XRegExp时,您可以使用简写\pL代替\p{Letter},但不能使用JavaScript自己的正则表达式。)

答案 2 :(得分:0)

我不确定这个表达方式

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

可能接近我们在这里想要的,但也许是一种选择。

在此demo中,解释了表达式。

测试

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

console.log(str.replace(regex, subst));