Javascript-在unicode字符串中搜索unicode字符串

时间:2018-12-11 03:37:37

标签: javascript string search unicode

当我尝试在Unicode字符串中搜索Unicode字符串时,找不到任何解决方案。

例如:检查字符串'vie'中是否包含字符串'Mr. ViỆt has a blue house'

所以我尝试如下困难的方法:

// Convert string to Unicode
function toUnicode(theString) {
  var unicodeString = '';
  for (var i=0; i < theString.length; i++) {
    var theUnicode = theString.charCodeAt(i).toString(16).toUpperCase();
    while (theUnicode.length < 4) {
      theUnicode = '0' + theUnicode;
    }
    theUnicode = '\\u' + theUnicode;
    unicodeString += theUnicode;
  }
  return unicodeString;
}

// Convert string to be Regex Unicode
function toRegexUnicode(theString) {
  var unicodeString = '';
  for (var i=0; i < theString.length; i++) {
    var theUnicode = theString.charCodeAt(i).toString(16).toUpperCase();
    while (theUnicode.length < 4) {
      theUnicode = '0' + theUnicode;
    }
    theUnicode = '\\u' + theUnicode;
    unicodeString += theUnicode;
  }
  return new RegExp('[' + unicodeString + ']')
}

// Search
function searchUnicode() {
    var strOriginal = "Mr. ViỆt has a blue house"
    var regexUnicode = toRegexUnicode(strOriginal)
    var strSearch = toUnicode('vie')
    var result = regexUnicode.test(strSearch)
    console.log(result)
}

在以下位置进行测试:https://www.w3schools.com/code/tryit.asp?filename=FY3NGXMQRMLA

还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

首先,您的正则表达式表达错误。取下括号。

第二,您正在创建正则表达式测试错误的方法。 您当前正在使用完整字符串设置正则表达式搜索。 您也没有将strOriginal转换为Unicode。 这意味着您的searchUnicode函数需要显示如下:

var strOriginal = "Mr. ViỆt has a blue house"
var strOriginalUnicode = toUnicode(strOriginal)
var strSearch = toUnicode('vie')
var regexUnicode = toRegexUnicode(strSearch)
var result = regexUnicode.test(strOriginalUnicode)

接下来,我们可以像这样简化您的toRegexUnicode函数:

// Convert string to be Regex Unicode
function toRegexUnicode(theString) {
  theString = theString.replace(/\\/g, "\\\\")
  return new RegExp(theString)
}

无需重复使用转换方法。您还将注意到所有\的全局替换成为\\。这是因为正则表达式将反斜杠视为转义字符,因此我们需要转义转义字符。

答案 1 :(得分:0)

我尝试另一种方法,只需将所有字符串转换为ASCII然后搜索:

function stringToASCII(str) {
  try {
    return str.replace(/[àáảãạâầấẩẫậăằắẳẵặ]/g, 'a')
      .replace(/[èéẻẽẹêềếểễệ]/g, 'e')
      .replace(/[đ]/g, 'd')
      .replace(/[ìíỉĩị]/g, 'i')
      .replace(/[òóỏõọôồốổỗộơờớởỡợ]/g, 'o')
      .replace(/[ùúủũụưừứửữự]/g, 'u')
      .replace(/[ỳýỷỹỵ]/g, 'y')
  } catch {
    return ''
  }
}

function searchASCII() {
  var strOriginal = "Mr. ViỆt lê nguyễn thị tùng á à ạds"
  var strSearch = "vie"

  var strOriginalToASCII = stringToASCII(strOriginal.toLowerCase())
  var strSearchToASCII = stringToASCII(strSearch.toLowerCase())
  var result = strOriginalToASCII.includes(strSearchToASCII)

  // Results
  console.log('strOriginalToASCII: ', strOriginalToASCII)
  console.log('strSearchToASCII: ', strSearchToASCII)
  console.log('result: ', result)
}

输出:

strOriginalToASCII: mr. viet le nguyen thi tung a a ads
strSearchToASCII: vie
result: true

在以下位置进行测试:https://www.w3schools.com/code/tryit.asp?filename=FY3NGXMQRMLA