用正则表达式正确替换缩放与其扩展

时间:2017-10-03 11:31:03

标签: javascript regex

我需要更换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)
}

1 个答案:

答案 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中的替换模式中加倍)。