我想对乌尔都语单词执行替换字符串操作,但是以下代码未将آپ
替换为aap
。我正在使用单词边界,以便它代替整个单词而不是单词的各个部分。
var str ="آپ کا نام کیا ہے؟";
var res = str.replace(/\bآپ\b/g, "aap");
console.log(res);
我期望以下输出:
کا نام کیا ہے؟ aap
答案 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));