Como saber se uma string contém um determinado caractere em JavaScript?

335

Eu tenho uma página com uma caixa de texto em que um usuário deve digitar um código de registro de 24 caracteres (letras e números, sem distinção entre maiúsculas e minúsculas). Eu costumava maxlengthlimitar o usuário a inserir 24 caracteres.

Os códigos de registro geralmente são dados como grupos de caracteres separados por hífens, mas eu gostaria que o usuário inserisse os códigos sem os hífens.

Como posso escrever meu código JavaScript sem jQuery para verificar se uma determinada sequência que o usuário digita não contém hífens, ou melhor ainda, contém apenas caracteres alfanuméricos?

Rio Vivian
fonte
2
A resposta encontrada aqui stackoverflow.com/questions/3192612 possui as informações sobre como validar no alfanumérico.
amigos estão dizendo sobre jascav
1
E para aprender expressões regulares
Felix Kling
Para você, pessoal do jquery, você deve e pode usar inArray.
Jonh
3
Como a entrada é formatada não é um problema humano. É o problema do computador. Faça o que o usuário digitar e remova todos os caracteres que não pertencem (não-alfa), teste para ver se o resultado possui 24 caracteres e valide-o. O usuário realmente odeia entrada formatada.
Tggagne 19/10/2013

Respostas:

592

Para encontrar "olá" em your_string

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

Para o alfanumérico, você pode usar uma expressão regular:

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

Expressão regular alfanumérica

kemiller2002
fonte
Isso foi bastante útil. Falando como programador python, estou usando isso para substituir a palavra-chave "in" (que pode ou não ser pouco ortodoxa, não tenho certeza), mas funciona para mais do que apenas um caractere.
trevorKirkby
1
Não entendo como isso foi votado na resposta. Vejo que muitas pessoas vêm aqui pesquisando no Google. Uma maneira melhor definitivamente seria usar uma expressão regular.
Spock
25
Você usaria uma expressão regular para procurar um único caractere? Essa é uma quantidade excessiva de sobrecarga para obter exatamente a mesma coisa que a função integrada faz. Muitas pessoas não entendem o regex e, geralmente, a resposta mais simples é a melhor.
kemiller2002
Eu iria com /hello/g.test(your_string). Enquanto indexOf funciona, acho que um teste de regex conta uma história melhor do que você está tentando realizar. Se estou tentando encontrar uma sequência de caracteres dentro de uma string, o índice é irrelevante.
Joe Maffei
69

Com ES6 .includes ()

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

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

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

E: Não suportado pelo IE - você pode usar o operador Tilde ~( Bitwise NOT ) com .indexOf ()

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

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

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

Usado com um número, o operador Tilde efetivamente faz ~N => -(N+1). Use-o com dupla negação !!( Logical NOT ) para converter os números em bools:

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

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

!!~"FooBar".indexOf("oo", 2); // false
julian libor
fonte
Simples, legível e retorna um booleano. Perfeito para quando você não precisa de uma expressão regular.
Bryanbraun # 14/17
1
** Observe que o método includes não é suportado pelo IE ** #
Bonez024
52

Se você tiver o texto na variável foo:

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

Isso irá testar e certificar-se de que o usuário inseriu pelo menos um caractere, e entrou apenas caracteres alfanuméricos.

cdhowie
fonte
A melhor resposta aqui, todas as outras respostas são nulas do meu pov.
Chris_r # 15/19
19

verifique se a string (palavra / frase ...) contém uma palavra / caractere específico

if ( "write something here".indexOf("write som") > -1 )  { alert( "found it" );  } 
T.Todua
fonte
Ele funciona no IE? -> stackoverflow.com/questions/3480771/…
Ger Soto
11

O ES6 contém o método embutido ( includes) em String prototype, que pode ser usado para verificar se a string contém outra ou não.

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

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

O polyfill a seguir pode ser usado para adicionar esse método em navegadores não suportados. ( Fonte )

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;
    }
  };
}

Vipin Kumar
fonte
7

Use uma expressão regular para fazer isso.

function isAlphanumeric( str ) {
 return /^[0-9a-zA-Z]+$/.test(str);
}
Gabriele Petrioli
fonte
Isso verificará exatamente um dígito e não aceitará todos os caracteres alfanuméricos, conforme desejado pelo OP.
cdhowie
@cdhowie .. esqueci um +, mas eu tinha interpretado mal a pergunta também .. obrigado por apontar.
Gabriele Petrioli
6

Vocês todos estão pensando demais. Basta usar uma expressão regular simples, é seu melhor amigo.

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

Aprenda Regex em 5 minutos?

Adam McArthur
fonte
Para fazer algo prático com isso, basta executá-lo em uma seleção:if ( string1.test(regex) ) { alert("He likes pizza!"); }
Adam McArthur
E seu teste alfanumérico seria ...var regex = /^[a-z0-9]+$/i
Adam McArthur
4
Isso é ao contrário. Veja developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/… regexObj.test (str)
Ralph Yozzo 02 /
Para trás? regex.test(string1)
HLCS
Seus métodos de exemplo são invertidos. Deveria ser regex.test(str). ( str.match(regex)É semelhante, mas não retorna um boolean.)
jsejcksn
6

Se você estiver procurando por caracteres no início ou no final da string, também poderá usar startsWitheendsWith

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

var inputString = "this is home";
var findme = "home";

if ( inputString.indexOf(findme) > -1 ) {
    alert( "found it" );
} else {
    alert( "not found" );
}

Aman Maurya
fonte
4

Para testar apenas caracteres alfanuméricos:

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

O regex está testando 1 ou mais (+) do conjunto de caracteres 0-9, AZ e az, começando com o início da entrada (^) e parando com o final da entrada ($).

Fairfieldt
fonte
4

A resposta de Kevins está correta, mas requer um número "mágico" da seguinte maneira:

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

Nesse caso, você precisa saber que -1 significa não encontrado . Eu acho que uma versão um pouco melhor seria:

var containsChar = s.indexOf(somechar) >= 0;
Mika Karjunen
fonte
Bem, de acordo com os padrões original , atual e de rascunho , indexOf()retornará -1 se a sequência não for encontrada. Portanto, é dificilmente mais mágico do que usar 0 .
Todos os trabalhadores têm Essencial
3

Tente o seguinte:

if ('Hello, World!'.indexOf('orl') !== -1)
    alert("The string 'Hello World' contains the substring 'orl'!");
else
    alert("The string 'Hello World' does not contain the substring 'orl'!");

Aqui está um exemplo: http://jsfiddle.net/oliverni/cb8xw/

Oliver Ni
fonte
3

A função de pesquisa de string também é útil. Ele procura por um caractere e uma sub_string em uma determinada string.

'apple'.search('pl') retorna 2

'apple'.search('x') Retorna -1

learner010
fonte
2

Se você estiver lendo dados do DOM, como a tag ap ou h1, por exemplo, desejará usar duas funções JavaScript nativas, isso é fácil, mas limitado ao es6, pelo menos para a solução que vou fornecer. Vou procurar todas as tags p no DOM, se o texto contiver um "T", o parágrafo inteiro será removido. Espero que este pequeno exemplo ajude alguém!

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();
    } 
});
Der Deutsche
fonte
1

Funcionando perfeitamente. Este exemplo ajudará muito.

<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>
MankitaP
fonte
0

Demonstração: O método include () encontra o caractere "contains" em toda a string, retornando um true.

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

str.includes("contains");

//The output of this

  true

Desenvolvedor
fonte
0

Verifique se a sequência é alfanumérica ou alfanumérica + alguns caracteres permitidos

O método alfanumérico mais rápido provavelmente é mencionado em: Melhor maneira de verificar alfanumérico em Javascript , pois opera diretamente em intervalos de números.

Em seguida, para permitir alguns outros caracteres extras com segurança, basta colocá-los em umaSet pesquisa rápida.

Acredito que esta implementação lidará com pares substitutos corretamente corretamente.

#!/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 upstream .

Testado no Node.js v10.15.1.

Ciro Santilli adicionou uma nova foto
fonte