Javascript - Поиск строки Unicode в строке Unicode - PullRequest
0 голосов
/ 11 декабря 2018

Когда я пытаюсь найти строку Юникода в строке Юникода, я не нахожу решения.

Пример: проверить, содержится ли строка '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 голосов
/ 17 декабря 2018

Я пытаюсь по-другому, просто преобразовать всю строку в 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

0 голосов
/ 11 декабря 2018

Во-первых, ваше выражение регулярного выражения неверно.Удалите фигурные скобки.

Во-вторых, вы создаете свое регулярное выражение, проверяя его неправильно.В настоящее время вы настраиваете поиск по регулярному выражению, используя полную строку.Вы также не конвертируете 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)
}

Нет необходимости повторно использовать ваше преобразованиеметод.Вы также отметите глобальные замены всех \ на \\.Это потому, что Regex рассматривает обратную косую черту как escape-символ, поэтому нам нужно экранировать наш escape-символ.

...