2009-11-25 20 views

Respuesta

1

Utilizaría Negative lookarounds pero la expresión es muy compleja si no conoce la posición esperada (o incluso el orden) de los términos. Do ¿conoce el orden o patrón?

De lo contrario te aconsejo utilizar otra herramienta que podría fácilmente bucle (o lista comp) a través de un archivo línea por línea y hacer Instr o Contiene u otro sencillo, más rápido , pruebas lógicas ...

+0

No hay patrones para mis casos, creo. Me sorprende que esta simple pregunta sea tan complicada para regex. – Ricky

+0

el problema es expresar la lógica – annakata

23

Para Visual Studio 2012 (y versiones posteriores):

^(?!.*strB).*strA.*$ 

Explicación:

^   # Anchor the search at the start of the line 
(?!.*strB) # Make sure that strB isn't on the current line 
.*strA.* # Match the entire line if it contains strA 
$   # Anchor the search to the end of the line 

Es posible que desee agregar (?:\r\n)? al final de la expresión regular si también desea eliminar los retornos de carro/alimentaciones de línea junto con el resto de la línea.

+5

Esto funcionó. Tuve que extenderme para admitir varias cadenas de exclusión, que resultó ser, p. '^ (?!. * strB) (?!. * strC) (?!. * strD). * strA. * $'. – DuckMaestro

1

Voy a suponer que el cuadro de búsqueda realmente acepta expresiones regulares generales. El uso de búsqueda negativa hacia delante:

(?!^.*strB.*$)strA 

que necesitará para configurar las opciones múltiples (^ y $ partido en el inicio/final de las líneas). Si no puede configurarlo usando las opciones de diálogo, intente:

(?m)(?!^.*strB.*$)strA 

Sin embargo, este es probablemente el modo predeterminado en ese motor.

+0

Debe anclar toda la expresión regular, no solo la anticipación. Eso significa poner el '^' * fuera * del lookahead y agregar otro '. *' Delante de 'strA'. Pero no es necesario anclar ninguna parte de la expresión regular al * final * de la línea (es decir, el '. * $' Puede ir). –

+0

Bueno, no sé. Cuando lo miro ahora, lo escribí como "si una línea no contiene strB, combine strA". Todavía me parece correcto, ya que estamos combinando línea por línea. Creo. Leer expresiones antiguas me daña el cerebro. – wds

16

Para Visual Studio 2010 (y versiones anteriores):

El estudio de la caja de búsqueda visual tiene su propia versión extraña de la sintaxis de expresiones regulares. Esta expresión trabaja conforme a lo solicitado:

^~(.*strB).*strA 

^ coincide con el comienzo de una línea. (Típicamente para un editor de texto, no hay opción "multilínea";. ^ y $ coinciden siempre en los límites de línea)

. coincide con cualquier carácter excepto un salto de línea. (No tan típicamente, parece que no hay un modo "de una sola línea" o "punto-todo" que permita que los puntos coincidan con los saltos).

~(...) es la construcción "prevenir coincidencia", equivalente (hasta donde sé) a la anticipación negativa ((?!...)) utilizada por los otros respondedores.

+4

FYI, a partir de Visual Studio 2012, el motor de expresiones regulares dotNet ahora se usa para búsquedas, por lo tanto, la sintaxis extraña debería desaparecer. Buena respuesta, pero ten en cuenta qué versión de VS estás usando. – redcalx

+0

Prueba en Visual Studio 2010 SP1Rel, esta respuesta debe modificarse si "strB" podría ser DESPUÉS de "strA". Pruebe '^ ~ (. * StrB). * StrA ~ (. * StrB)'. O '~ (strB). * StrA. * ~ (StrB)'. – ToolmakerSteve

0

Esto funcionó para mí con Visual Studio 2010:.

^+ [^ (strB)] + (strA) + [^ (strB)] + $

Cuestiones relacionadas