regulares regular reg online into expresiones array ruby regex string-split

regular - ruby split string into array



¿Cómo dividir una cadena de CamelCase en sus subcadenas en Ruby? (7)

Aunque es una pregunta de expresión regular de Ruby y la respuesta de DigitalRoss es correcta y brilla por su simplicidad, quiero agregar una respuesta de Java:

// this regex doesn''t work perfect with Java and other regex engines "NowIsTheTime".split("(?=[A-Z])"); // ["", "Now", "Is", "The", "Time"] // this regex works with first uppercase or lowercase characters "NowIsTheTime".split("(?!(^|[a-z]|$))"); // ["Now", "Is", "The", "Time"] "nowIsTheTime".split("(?!(^|[a-z]|$))"); // ["now", "Is", "The", "Time"]

Tengo una buena cadena de CamelCase como ImageWideNice o ImageNarrowUgly . Ahora quiero romper esa cadena en sus subcadenas, como Image , Wide o Narrow , y Nice o Ugly .

Pensé que esto podría ser resuelto simplemente por

camelCaseString =~ /(Image)((Wide)|(Narrow))((Nice)|(Ugly))/

Pero extrañamente, esto solo llenará $1 y $2 , pero no $3 .

¿Tienes una mejor idea para dividir esa cadena?


Has probado

camelCaseString =~ /(Image)(Wide|Narrow)(Nice|Ugly)/

?


La respuesta de DigitalRoss es correcta ya que maneja el caso general en el que no se sabe si se trata de un caso de camello estricto (minúscula del primer carácter) o del caso de Pascal (mayúscula de la primera letra).

Si sabe en cuál de estas formas está la cadena, o si quiere forzar una u otra, Inflector puede hacerlo.

Para el caso de Pascal:

"NowIsTheTime".titleize

Para el caso de camello:

"nowIsTheTime".titleize.camelize :lower


La respuesta de DigitalRoss no reconocerá las siglas incrustadas en CamelCase. Por ejemplo, dividirá "MyHTMLTricks" en "My HTML Tricks" en lugar de "My HTML Tricks".

Aquí hay otra opción basada en la función AsSpaced() en PmWiki , que hace un gran trabajo de ser sensible a casos como este:

"MyHTMLTricks" / .gsub(/([[:lower:]//d])([[:upper:]])/, ''/1 /2'') / .gsub(/([^-//d])(//d[-//d]*( |$))/,''/1 /2'') / .gsub(/([[:upper:]])([[:upper:]][[:lower:]//d])/, ''/1 /2'') => "My HTML Tricks"

La otra cosa que me gusta de este enfoque es que deja la cadena una cadena, en lugar de transformarla en una matriz. Si realmente quieres la matriz, simplemente agrega una división al final.

"MyHTMLTricks" / .gsub(/([[:lower:]//d])([[:upper:]])/, ''/1 /2'') / .gsub(/([^-//d])(//d[-//d]*( |$))/,''/1 /2'') / .gsub(/([[:upper:]])([[:upper:]][[:lower:]//d])/, ''/1 /2'') / .split => ["My", "HTML", "Tricks"]

Para el registro, aquí está el código PHP original de PmWiki.

function AsSpaced($text) { $text = preg_replace("/([[:lower:]//d])([[:upper:]])/", ''$1 $2'', $text); $text = preg_replace(''/([^-//d])(//d[-//d]*( |$))/'', ''$1 $2'', $text); return preg_replace("/([[:upper:]])([[:upper:]][[:lower:]//d])/", ''$1 $2'', $text); }


Sé que esto es viejo, pero vale la pena mencionarlo para otros que podrían estar buscando esto. En rieles puedes hacer esto: "NowIsTheTime".underscore.humanize


I/p:- "ImageWideNice".scan(/[A-Z][a-z]+/).join(",") O/p:- "Image,Wide,Nice"


s = ''nowIsTheTime'' s.split /(?=[A-Z])/ => ["now", "Is", "The", "Time"]

?=pattern es un ejemplo de lookahead positivo. Esencialmente coincide con un punto en la cadena justo antes del patrón. No consume los caracteres, es decir, no incluye el patrón como parte de la coincidencia. Otro ejemplo:

irb> ''streets''.sub /t(?=s)/, ''-'' => "stree-s"

En este caso, se hace coincidir la s (solo la segunda t ) pero no se reemplaza. Gracias a @Bryce y su regexp doc link. Bryce Anderson añade una explicación:

El ?= Al comienzo del () grupo de coincidencia se llama lookahead positivo, que es solo una forma de decir que mientras la expresión regular observa a los caracteres para determinar si coinciden, no los hace parte de la coincidencia. split() normalmente come los caracteres intermedios, pero en este caso la coincidencia en sí está vacía, así que no hay nada [allí].