usar tutorial solo regulares online numeros expresiones example como alfanumerico regex search glob

tutorial - regex c# online



Crear expresiones regex a partir de glob (7)

Escribo mi propia función, usando c ++ y boost :: regex

std::string glob_to_regex(std::string val) { boost::trim(val); const char* expression = "(//*)|(//?)|([[:blank:]])|(//.|//+|//^|//$|//[|//]|//(|//)|//{|//}|////)"; const char* format = "(?1////w+)(?2//.)(?3////s*)(?4////$&)"; std::stringstream final; final << "^.*"; std::ostream_iterator<char, char> oi(final); boost::regex re; re.assign(expression); boost::regex_replace(oi, val.begin(), val.end(), re, format, boost::match_default | boost::format_all); final << ".*" << std::ends; return final.str(); }

parece que todo funciona bien

Escribo un programa que analiza texto con expresiones regulares. La expresión regular debería obtenerse del usuario. Desearía usar la sintaxis glob para la entrada del usuario, y convertir glob string a la expresión regular internamente. Por ejemplo:

"foo.? bar*"

debe convertirse a

"^.*foo/./w/bar/w+.*"

De alguna manera, necesito escapar de todos los personajes significativos de la cadena, entonces necesito reemplazar glob * y? personajes con sintaxis regexp adecuada. ¿Cuál es la forma más conveniente de hacer esto?


No estoy seguro de entender completamente los requisitos. Si asumo que los usuarios quieren encontrar "entradas" de texto donde coincida su búsqueda, entonces creo que esta manera brutal funcionaría como un comienzo.

Primero escapa todo lo regex-significativo. Luego use reemplazos no regexales para reemplazar los caracteres glob (ahora escapados) y cree la expresión regular. Al igual que en Python:

regexp = re.escape(search_string).replace(r''/?'', ''.'').replace(r''/*'', ''.*?'')

Para la cadena de búsqueda en la pregunta, esto construye una expresión regular que se ve así (en bruto):

foo/../ bar.*?

Usado en un fragmento de Python:

search = "foo.? bar*" text1 = ''foo bar'' text2 = ''gazonk foo.c bar.m m.bar'' searcher = re.compile(re.escape(s).replace(r''/?'', ''.'').replace(r''/*'', ''.*?'')) for text in (text1, text2): if searcher.search(text): print ''Match: "%s"'' % text

Produce:

Match: "gazonk foo.c bar.m m.bar"

Tenga en cuenta que si examina el objeto coincidente puede obtener más información sobre la coincidencia y utilizar para resaltar o lo que sea.

Por supuesto, podría haber más, pero debería ser un comienzo.



no hay necesidad de hacks incompletos o no fiables. hay una función incluida con Python para esto

>>> import fnmatch >>> fnmatch.translate( ''*.foo'' ) ''.*//.foo$'' >>> fnmatch.translate( ''[a-z]*.txt'' ) ''[a-z].*//.txt$''


La función RegExp.fromWildExp de jPaq hace algo similar a esto. Lo siguiente se toma del ejemplo que está en la página principal del sitio:

// Find a first substring that starts with a capital "C" and ends with a // lower case "n". alert("Where in the world is Carmen Sandiego?".findPattern("C*n")); // Finds two words (first name and last name), flips their order, and places // a comma between them. alert("Christopher West".replacePattern("(<*>) (<*>)", "p", "$2, $1")); // Finds the first number that is at least three numbers long. alert("2 to the 64th is 18446744073709551616.".findPattern("#{3,}", "ol"));