需要正则表达式代码来匹配具有一个字符差异的单词

时间:2016-12-21 07:46:51

标签: regex

我必须匹配的单词是“FFM_L_REEF_30”(单词的长度不固定)
我必须匹配的单词列表是
“FFM_H_REEF_40”
“FFM_H_REEF_50”
“FFM_L_REEF_20”
“FFM_L_RAEF_30”

是否可以编写一个正则表达式,它可以匹配只有一个字符差异的单词,如

“FFM_L_REEF_20” - 在此数字3中更改为2
“FFM_L_QEEF_30” - 在此字符中,R更改为Q

编辑问题

3 个答案:

答案 0 :(得分:1)

试试下面的正则表达式。

^(?:(.)\1*(?:(?!\1).)\1*|(.)(?:(?!\2)(.))\3*$)$

DEMO

让我知道上述正则表达式失败的情况。

答案 1 :(得分:0)

是的,当然。你可以使用下一个正则表达式: a*.a* 这意味着您的字符串包含任意数量的' a',然后是任意符号,以及任何数量的' a'。 ''指除了' \ n'之外的任何符号。如果您还希望字符串包含' \ n',您可以使用下一个正则表达式: a*[\s\S]a*

答案 2 :(得分:0)

这是一个JS示例,说明如何使用Levenshtein算法解决它。

(请注意,getEditDistance方法是从wikibooks复制的,其中有多种编程语言的实现。)



var testWord = "FFM_L_REEF_30",
    wordList = [
      "FFM_H_REEF_40",
      "FFM_H_REEF_50",
      "FFM_L_REEF_20",
      "FFM_L_RAEF_30",
      "A rendom sentence",
      testWord,
      "FFM_L_REEF_3"
  ],
  w;

function getEditDistance(a, b) {

	// Code from https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance

	if (a.length === 0) return b.length;
	if (b.length === 0) return a.length;

	var matrix = [];

	// increment along the first column of each row
	var i;
	for (i = 0; i <= b.length; i++) {
		matrix[i] = [i];
	}

	// increment each column in the first row
	var j;
	for (j = 0; j <= a.length; j++) {
		matrix[0][j] = j;
	}

	// Fill in the rest of the matrix
	for (i = 1; i <= b.length; i++) {
		for (j = 1; j <= a.length; j++) {
			if (b.charAt(i - 1) == a.charAt(j - 1)) {
				matrix[i][j] = matrix[i - 1][j - 1];
			} else {
				matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
										Math.min(matrix[i][j - 1] + 1, // insertion
												 matrix[i - 1][j] + 1)); // deletion
			}
		}
	}

	return matrix[b.length][a.length];
};

wordList.forEach(function (w) {
	var ld = getEditDistance(w, testWord);

	document.write('<p style="color:' + (ld>1?'red':'green') + ';">"' + w + '" gives levenshtein distance ' + ld + '</p>');

});
&#13;
&#13;
&#13;