用正则表达式替换缩写

时间:2017-06-13 20:34:10

标签: javascript regex

我在JavaScript中有可能包含缩写的字符串。我需要一个能够可靠地替换这些缩写的正则表达式。我不太擅长正则表达式,所以我需要一些帮助。这是一个简单的例子:

var string1="Home in the USA";
var string2="SOME USABILITY...";
var string3="The USA is home";
string1.replace(/USA/,"United States of America")

有三个可能的字符串,我想用“美利坚合众国”取代“USA”,但我不希望它触及第二个字符串,因为它显然是一个不同的词。所以我需要一个正则表达式,只有当下面的字符是空格或什么都没有时才会替换匹配的缩写。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您需要为此使用单词边界。简单的正则表达式是:/\bUSA\b/g

这表示在美国之前或之后必须有一个单词边界。另外需要注意的是,这是一个GLOBAL正则表达式,因此它将用字边界替换每个出现的“USA”,而不仅仅是第一个。看看这个regexer:

http://regexr.com/3g5hs

答案 1 :(得分:-1)

TL; DR:/(?:\s)USA(?:\s)/,但请查看底部更复杂的功能。

如果要检查以下字符是否为空格,只需添加一个前瞻,如下所示:

const strs = [
  'USA is a country',
  'They say USA there',
  'We are in the USA',
  'SOME USABILITY'
];

const pattern = /USA(?:\s)/;
const replacement = 'United States of America ';

console.log(strs.map(str => str.replace(pattern, replacement)));

注意两件事:

  • 如果单词结尾,只需提前检查即可。
  • replace()功能中,它会替换整个模式,因此您需要将空间添加回替换。

如果你想看看双方,那几乎是一样的:

const strs = [
  'USA is a country',
  'They say USA there',
  'We are in the USA',
  'SOME USABILITY'
];

const pattern = /(?:\s)USA(?:\s)/;
const replacement = ' United States of America ';

console.log(strs.map(str => str.replace(pattern, replacement)));

如果你想在任何地方处理,你还需要添加一个检查字符串的开头或结尾:

const strs = [
  'USA is a country',
  'They say USA there',
  'We are in the USA',
  'SOME USABILITY'
];

const pattern = /(?:\s|^)USA(?:\s|$)/;
const replacement = ' United States of America ';

console.log(strs.map(str => str.replace(pattern, replacement).trim()));

请注意,在这种情况下,我们还会修剪额外的东西。

一种稍微清洁的方法,所以你不必担心多余的空间就可以通过几个步骤来做事:

const strs = [
  'USA is a country',
  'They say USA there',
  'We are in the USA',
  'SOME USABILITY'
];

const target = 'USA';
const replacement = 'United States of America';

const replaceWord = (str, word, replacement) => {
  const pattern = new RegExp(`(?:[^a-zA-Z-]|^)(${target})(?:[^a-zA-Z-]|$)`, 'g');
  return (str.match(pattern) || [])
    .reduce((result, match) => result.replace(match, match.replace(word, replacement)), str);
 };

console.log(strs.map(str => replaceWord(str, target, replacement)));

这是一个更复杂的解决方案。首先,我将模式更新为不寻找空格,而是任何非字母的(以说明与逗号和句点等内容相冲突的单词)。

我们实际的替换首先获得所有匹配(使用额外的检查)。然后我们查看它,并且对于每个匹配,您只替换原始目标,然后使用整个位替换前一个匹配。

这更加灵活。

我还将模式构建为变量,因此您可以替换任何单词。