2011-07-05 27 views
5

Quiero una expresión regular que valida una cadena de longitud 1 que tenga por personajes A o B (mayúsculas y minúsculas) en el inicioPartido solamente A o caso B insensibles

lo que este debe devolver verdadero

A 
    a 
    B 
    b 

de esas palabras no va a coincidir, por lo que el siguiente volvería falsa:

"America" 
"Bi" 
"a door" 
+1

Y quiero un millón de dólares :) ¿Qué has hecho hasta ahora? –

+2

¿Por qué no puedes simplemente comparar tu cadena con esos cuatro casos? Regex parece exagerado por esto. – whrrgarbl

+7

¿Por qué hay una recompensa en esta pregunta? No es interesante ni desafiante ... @ User2867655 - ¿es esto un error? – Kobi

Respuesta

10

puede utilizar /^[AaBb]$/. Eso es lo más simple que sé.

+0

Gracias, funciona, tengo^[AaBn] pero sin $. –

+1

@Richard FYI '$' significa "fin de la cadena". – SteeveDroz

4

Pruebe esta expresión regular: ^[abAB]$

También se puede utilizar una opción de mayúsculas y minúsculas (en Perl o Javascript): /^[ab]$/i

+3

O en todos los idiomas: '(? I)^[ab] $'. – Joey

+0

@Joey: ¡sí! ¡gracias por eso! –

2

Es necesario utilizar ^ (inicio de la cadena) y $ (fin de la cadena) en su patrón:

/^[AB]$/i 

donde i modificador es una caja de la bandera insensible, por lo que sólo coincidirá siguientes caracteres:

  • Un
  • B
  • un
  • b
+1

Esto supone que están usando JavaScript, Perl o PCRE. Esa suposición podría no ser cierta. – Joey

+0

También en PHP será el trabajo –

+0

PHP usa PCRE ... – Joey

3

Puesto que usted quiere para que coincida con una longitud fija de caracteres (en su caso uno), por lo que debe utilizar Anchoring en su expresión regular usando ^ y $ o usando \A y \Z. Esto significa el inicio y el final de una cadena (por simplicidad). Puede poner su expresión regular entre los anclajes para que coincida con toda la cadena. Por ejemplo:

^...REGEX...$ 
\A...REGEX...\Z 

Ahora vienen de igualar el carácter A o B en la cadena. Hay muchas formas de lograr esto. Veamos algunos de ellos.

Usando Character Class/Set: El uso de este se puede colocar varios caracteres dentro de la [] y recoger sólo un personaje para el juego. Entonces, para su caso, la expresión regular será como a continuación. Significa cualquier carácter de A, a, B o b (lo que significa cualquier caso).

^[AaBb]$ 

Usando Alternating/Pipe: Esto le ayuda a utilizar OR condición en su expresión regular, lo que significa una coincidencia de expresiones regulares de múltiples. Veamos la expresión regular a continuación, aquí está usando los caracteres en la tubería.

^(A|a|B|b)$ 

Usando modifier: Puede utilizar modificadores en su expresión regular para coincidir tanto en mayúsculas o minúsculas. En ese caso, puede usar solo A y B en su expresión regular para que coincida.Aquí estoy usando el modificador (?i) para ignorar el caso.

(?i)^[AB]$ 

Quiero creer que habrá muchas más formas de hacerlo. ¡Puede encontrar eso usando Google Search, o puede esperar que otros Sagacious de este sitio respondan!

+2

Su opción de Tubería Alterna debe tener corchetes '^ (A | a | B | b) $' – sgauria

+0

@sgauria Sí, gracias. Perdí eso. :-pag –

0

Esto no se debe hacer usando expresiones regulares, ya que esto es no una gramática regular; es una gramática star free.

Estrictamente hablando, no hay analizadores estándar ni nada para las gramáticas libres de estrellas. Por lo tanto, simplemente debe hacer su propio uso de controles de cadena básicos disponibles en su idioma.

Por ejemplo:

bool test_for_ab_i(const std::string& input) 
{ 
    if(input.length() > 1) return false; 
    const char& test = input[0]; 

    if(test == 'a' || test == 'b' || test == 'A' || test == 'B') return true; 
    return true; 
} 

Esto es casi ciertamente más eficiente que incluso el más bien optimizado DFA o NFA; sin embargo, si necesita analizar expresiones regulares reales, considere usar RE2. Lo encontrará mucho mejor que cualquier otro compatible con Perl o PCRE.

Cuestiones relacionadas