2011-02-28 10 views
6

Estoy convirtiendo código VBA que contiene el operador LIKE, como enC# fragmento necesario para replicar VBA Como operador

dim sToken as String 
    if sToken Like "(*,*)" then ... 

En todos los casos, los patrones de uso de sólo el comodín *, que coincide con cualquier cadena (incluyendo la cadena vacía) El operador VBA Like produce solo un resultado verdadero/falso, por lo que depende del código VBA posterior analizar más y extraer las subcadenas coincidentes siempre que haya una coincidencia.

Estaría muy agradecido si alguien puede proporcionar un fragmento de C# para probar el mismo tipo de coincidencia de comodín simple. Si el fragmento también produce subcadenas coincidentes, incluso mejor.

+0

Es posible que desee utilizar RegEx – CodesInChaos

Respuesta

5

Bueno, ese patrón particular, podrían coincidir con

if (sToken.StartsWith("(") && sToken.EndsWith(")") 
    && sToken.Contains(",")) 

pero en general se puede encontrar que tiene más sentido usar expresiones regulares. Por ejemplo:

using System; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Regex regex = new Regex(@"^\(.*,.*\)$"); 

     Console.WriteLine(regex.IsMatch("x(a,b)")); // False due to the x 
     Console.WriteLine(regex.IsMatch("(a,b)x")); // False due to the x 
     Console.WriteLine(regex.IsMatch("(ab)")); // False due to the lack of , 
     Console.WriteLine(regex.IsMatch("(a,b")); // False due to the lack of) 
     Console.WriteLine(regex.IsMatch("(a,b)")); // True! 
     Console.WriteLine(regex.IsMatch("(aaa,bbb)")); // True! 
     Console.WriteLine(regex.IsMatch("(,)")); // True! 
    } 
} 

cosas a la nota con el patrón aquí:

  • He usado un cadena textual literal (el @ al principio) para que sea más fácil de realizar escapar dentro la expresión regular
  • ^$ y forzarlo para que coincida con la cadena entera
  • los soportes se escaparon para que no sean tratados como operadores de agrupamiento

La página MSDN "Regular Expression Language Elements" es una buena referencia para .NET expresiones regulares.

10

Varias personas han sugerido expresiones regulares que deberían funcionar bien para este escenario. Otra opción es usar el operador VB Like directamente desde el código C#. Esto se puede hacer invocando al ayudante del compilador LikeOperator.LikeString. Esta función se encuentra en el ensamblado de tiempo de ejecución de VB, Microsoft.VisualBasic.dll, y se puede usar desde C#.

using Microsoft.VisualBasic.CompilerServices; 

... 

if (LikeOperator.LikeString(sToken, "(*,*)")) { 
    ... 
} 

No creo que esta versión tiene la paridad del 100% con la versión de VBA de Like pero será muy estrecha y se correspondan en los escenarios comunes.

+1

Si su aplicación heredada recibió el mismo filtro de operador de los usuarios y aún desea admitir la misma sintaxis para la compatibilidad con versiones anteriores de los usuarios, este es el camino a seguir. De lo contrario, use RegEx para el nuevo código. – orad

Cuestiones relacionadas