我需要更换HYD和HYD。与HYDRAULIC
但是你看到HYD。没有得到转换。我做错了什么?
console.log("HYD", /\bHYD\b/gi.test("HYD")) // OK!
console.log("HYD,CYLINDER", /\bHYD\b/gi.test("HYD,CYLINDER")) // OK!
console.log("HYD,CYLINDER", /\bHYD\b/gi.test("HYD,CYLINDER")) // <- OK!
console.log("HYD. CYLINDER", /\bHYD\.\b/gi.test("HYD. CYLINDER")) // NOT OK! Did not recognice HYD.
console.log("HYD.,CYLINDER", /\bHYD\.\b/gi.test("HYD.,CYLINDER")) // <- NOT OK! As I need to convert HYD. with HYDRAULIC..
// Example:
const abbreviation = "HYD.";
const expansion = "HYDRAULIC";
if(/\bHYD\.\b/gi.test("HYD.,CYLINDER")) { // as this does not returns true I cant continue do the replacement
"HYD.,CYLINDER".replace(abbreviation, expansion)
}
答案 0 :(得分:3)
问题的根本原因非常明显:在.
和,
之间,没有字边界,因此HYD.,
与/\bHYD\.\b/
不匹配}或/HYD\.?\b/
regexps。
此外,由于您正在动态构建正则表达式模式,因此您无法使用其他选项。
在这种情况下,最简单和最方便的解决方案是使用明确的单词边界(?!\w)
,如果有一个单词char(字母,数字或_
,这是一个未通过匹配的预测,这个可以进一步定制)紧靠当前位置的右侧。
因此,您需要构建这样的模式(考虑到所有搜索值都包含单词字符):
new RegExp("\\b" + val + "\\.?(?!\\w)")
请注意,反斜杠需要双重转义。 \\.?
模式将匹配1或0个点,(?!\\w)
将需要尾随字边界。
请注意,如果搜索值可以包含特殊字符(非字符字符),则需要使用类似
的内容new RegExp("(^|\\W)" + val.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "\\.?(?!\\w)")
并替换为"$1" + expansion.replace(/\$/g, '$$$$')
。
是的,如果要替换动态文字替换模式,.replace(/\$/g, '$$$$')
是必要的操作(因为文字$
必须在JS中的替换模式中加倍)。