Як визначити, чи рядок містить певний символ у JavaScript?


334

У мене є сторінка з текстовим полем, де користувач повинен ввести реєстраційний код з 24 символів (літери та цифри, нечутливі до регістру). Я раніше maxlengthобмежував користувача введенням 24 символів.

Реєстраційні коди зазвичай даються у вигляді груп символів, розділених тире, але я хотів би, щоб користувач вводив коди без тире.

Як я можу написати свій код JavaScript без jQuery, щоб перевірити, чи вказаний рядок, який користувач вводить, не містить тире, а ще краще, містить лише буквено-цифрові символи?


2
Тут знайдеться відповідь stackoverflow.com/questions/3192612 про те, як перевірити алфавітно-цифрові дані.
JasCav

1
І вивчити регулярні вирази: regular-expressions.info
Фелікс Клінг

Для вас, хто цікаво, ви повинні і могли використовувати inArray.
JonH

3
Форматування входу не є проблемою для людини. Це проблема комп’ютера. Візьміть все, що користувач введе, і видаліть усі символи, які не належать (не-альфа), протестуйте, щоб результат був 24 символи, а потім підтвердіть його. Користувач дійсно ненавидить відформатовані дані.
tggagne

Відповіді:


591

Щоб знайти "привіт" в your_string

if (your_string.indexOf('hello') > -1)
{
  alert("hello found inside your_string");
}

Для числового альфа можна використовувати регулярний вираз:

http://www.regular-expressions.info/javascript.html

Числовий регулярний вираз альфа


Це було цілком корисно. Виступаючи як програміст python, я використовую це для заміни ключового слова "in" (яке може бути, а може і не бути неортодоксальним, я не впевнений), але воно працює для більш ніж одного символу.
trevorKirkby

1
Я не розумію, як це було проголосовано у відповіді. Я можу бачити, що багато людей приїжджають сюди через Google. Кращим способом, безумовно, було б використання регулярного виразу.
Спок

25
Ви б використовували регулярний вираз, щоб перевірити наявність одного символу? Це надмірна кількість накладних витрат, щоб отримати саме те, що робить вбудована функція. Є багато людей, які не розуміють регулярного вираження, і, як правило, найпростіша відповідь найкраща.
kemiller2002

Я б пішов з /hello/g.test(your_string). Хоча indexOf працює, я думаю, що тест на регулярний вираз розповідає кращу історію того, що ви намагаєтеся досягти. Якщо я намагаюся знайти послідовність символів всередині рядка, індекс не має значення.
Джо Маффей


69

З ES6. Включає ()

"FooBar".includes("oo"); // true

"FooBar".includes("foo"); // false

"FooBar".includes("oo", 2); // false

E: Не підтримується IE - замість цього можна використовувати оператор Tilde ~( побіжно НЕ ) з .indexOf ()

~"FooBar".indexOf("oo"); // -2 -> true

~"FooBar".indexOf("foo"); // 0 -> false

~"FooBar".indexOf("oo", 2); // 0 -> false

Використовується з номером, оператор Tilde діє ~N => -(N+1). Використовуйте його з подвійним запереченням !!( логічним НЕ ) для перетворення чисел у булі:

!!~"FooBar".indexOf("oo"); // true

!!~"FooBar".indexOf("foo"); // false

!!~"FooBar".indexOf("oo", 2); // false

Простий, читабельний і повертає булевий. Ідеально підходить, коли вам не потрібен регулярний вираз.
bryanbraun

1
** Зверніть увагу, що IE-метод не підтримується IE **
Bonez024,

52

Якщо у вас текст змінна foo:

if (! /^[a-zA-Z0-9]+$/.test(foo)) {
    // Validation failed
}

Це дозволить перевірити і переконатися, що користувач ввів принаймні один символ і ввів лише буквено-цифрові символи.


Найкраща відповідь тут, всі інші відповіді є недійсними з мого pov.
chris_r


11

ES6 містить вбудований метод ( includes) у String's prototype, який можна використовувати для перевірки, чи містить рядок інший рядок чи ні.

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be')); 

Для додавання цього способу в непідтримувані веб-переглядачі може бути використаний наступний поліфайл. ( Джерело )

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }
    
    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}


7

Для цього використовуйте регулярний вираз.

function isAlphanumeric( str ) {
 return /^[0-9a-zA-Z]+$/.test(str);
}

Це дозволить перевірити рівно одну цифру і не прийме всіх буквено-цифрових символів, як бажає ОП.
cdhowie

@cdhowie .. забув +, але я неправильно прочитав питання .. дякую за вказівку.
Габріеле Петріолі

6

Ви все занадто важко думаєте. Просто використовуйте простий регулярний вираз, це ваш найкращий друг.

var string1 = "Hi Stack Overflow. I like to eat pizza."
var string2 = "Damn, I fail."

var regex = /(pizza)/g // Insert whatever phrase or character you want to find

string1.test(regex); // => true
string2.test(regex); // => false

Дізнайтеся Regex за 5 хвилин?


Отож, щоб зробити щось практичне з цим, ви просто запустіть його у виборі:if ( string1.test(regex) ) { alert("He likes pizza!"); }
Адам Макартур

А ваш алфавітно-цифровий тест був би ...var regex = /^[a-z0-9]+$/i
Адам МакАртур

4
Це назад. Дивіться developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… regexObj.test (str)
Ральф Йоццо

Це назад? regex.test(string1)
hlcs

Ваші приклади методів зворотні. Це повинно бути regex.test(str). ( str.match(regex)подібне, але не повертається
булевим

6

Якщо ви шукаєте символів (символів) на початку або в кінці рядка, ви також можете використовувати startsWithіendsWith

const country = "pakistan";
country.startsWith('p'); // true
country.endsWith('n');  // true


4

Щоб перевірити лише буквено-цифрові символи:

if (/^[0-9A-Za-z]+$/.test(yourString))
{
    //there are only alphanumeric characters
}
else
{
    //it contains other characters
}

Регекс тестує на 1 або більше (+) набору символів 0-9, AZ та az, починаючи з початку введення (^) і закінчуючи кінцем введення ($).


4

Відповідь Кевінса правильна, але для неї потрібне "магічне" число:

var containsChar = s.indexOf(somechar) !== -1;

У такому випадку вам потрібно знати, що -1 означає, що не знайдено . Я думаю, що трохи кращою буде версія:

var containsChar = s.indexOf(somechar) >= 0;

Ну в відповідно до початковими , поточними та проектами стандартів, indexOf()буде повертати -1 , якщо рядок не знайдено. Тож навряд чи більше магії, ніж використання 0 .
Усі працівники мають важливе значення


3

Функція пошуку рядка також корисна. Він здійснює пошук як символу, так і підрядка в заданому рядку.

'apple'.search('pl') повертає 2

'apple'.search('x') повернення -1


2

Якщо ви читаєте дані з DOM, наприклад, тег ap або h1, ви хочете використовувати дві нативні функції JavaScript, це легко, але обмежено es6, принаймні для рішення, яке я збираюся надати. Я буду шукати всі p теги в DOM, якщо текст містить "T", весь абзац буде видалений. Сподіваюся, цей маленький приклад комусь допоможе!

HTML

<p>Text you need to read one</p>
<p>Text you need to read two</p>
<p>Text you need to read three</p>

JS

let paras = document.querySelectorAll('p');

paras.forEach(p => {
  if(p.textContent.includes('T')){
       p.remove();
    } 
});

1

Працює бездоганно. Цей приклад допоможе багато.

<script>    
    function check()
    {
       var val = frm1.uname.value;
       //alert(val);
       if (val.indexOf("@") > 0)
       {
          alert ("email");
          document.getElementById('isEmail1').value = true;
          //alert( document.getElementById('isEmail1').value);
       }else {
          alert("usernam");
          document.getElementById('isEmail1').value = false;
          //alert( document.getElementById('isEmail1').value);
       }
    }
</script>

<body>
    <h1>My form </h1>
    <form action="v1.0/user/login" method="post" id = "frm1">
        <p>
            UserName : <input type="text" id = "uname" name="username" />
        </p>
        <p>
            Password : <input type="text" name="password" />
        </p>
        <p>
            <input type="hidden" class="email" id = "isEmail1" name = "isEmail"/>
        </p>
        <input type="submit" id = "submit" value="Add User" onclick="return check();"/>
    </form>
</body>

0

Демонстрація: метод include () знаходить символ "містить" у цілому рядку, він поверне справжнє.

var string = "This is a tutsmake.com and this tutorial contains javascript include() method examples."

str.includes("contains");

//The output of this

  true


0

Перевірте, чи рядок буквено-цифровий або буквено-цифровий + деякі дозволені символи

Найшвидший буквено-цифровий метод, ймовірно, згадується на: Найкращий спосіб буквено-цифрової перевірки у Javascript, оскільки він працює безпосередньо на діапазонах чисел.

Потім, щоб кілька інших додаткових символів здраво ми можемо просто покласти їх вSet для швидкого пошуку.

Я вважаю, що ця реалізація буде правильно поводитися з сурогатними парами .

#!/usr/bin/env node

const assert = require('assert');

const char_is_alphanumeric = function(c) {
  let code = c.codePointAt(0);
  return (
    // 0-9
    (code > 47 && code < 58) ||
    // A-Z
    (code > 64 && code < 91) ||
    // a-z
    (code > 96 && code < 123)
  )
}

const is_alphanumeric = function (str) {
  for (let c of str) {
    if (!char_is_alphanumeric(c)) {
      return false;
    }
  }
  return true;
};

// Arbitrarily defined as alphanumeric or '-' or '_'.
const is_almost_alphanumeric = function (str) {
  for (let c of str) {
    if (
      !char_is_alphanumeric(c) &&
      !is_almost_alphanumeric.almost_chars.has(c)
    ) {
      return false;
    }
  }
  return true;
};
is_almost_alphanumeric.almost_chars = new Set(['-', '_']);

assert( is_alphanumeric('aB0'));
assert(!is_alphanumeric('aB0_-'));
assert(!is_alphanumeric('aB0_-*'));
assert(!is_alphanumeric('你好'));

assert( is_almost_alphanumeric('aB0'));
assert( is_almost_alphanumeric('aB0_-'));
assert(!is_almost_alphanumeric('aB0_-*'));
assert(!is_almost_alphanumeric('你好'));

GitHub вище за течією .

Тестовано в Node.js v10.15.1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.