Estoy usando REGEXEXTRACT en Google Sheets que usa RE2 RegEx.

Quiero obtener dígitos en una cadena que aparezcan antes del carácter P o antes de los caracteres MC.

Esto es lo que tengo hasta ahora: (\.?\d*).?MC esto funciona si mi texto es algo así como "FM.3 MC1". En Google Sheets es así:

=REGEXEXTRACT(A1,"(\.?\d*).?MC") 

Esto funciona para obtener dígitos antes de MC, quiero agregar OR P así:

(\.?\d*).?MC|P 

Esto devuelve .3 si mi texto es "FM.3 MC1", pero está en blanco si mi texto es "FM.3 MC1 P2" o "FM.3 P1" y devuelve #N/A si mi el texto es "FM.3".

Además, si mi expresión regular es (\.?\d*).?P|MC, devuelve .3 si mi texto es "FM.3 P1" está en blanco si mi texto es "FM.3 MC P1"

No estoy seguro de si esto es RegEx, o si Google Sheets está siendo extraño.

Estoy buscando consejos.

0
J nui 6 mar. 2018 a las 23:16

3 respuestas

La mejor respuesta

Puede usar

(\.?\d*)\W?(?:MC|P)

Reemplacé .? (= 1 o 0 caracteres) con \W ya que creo que solo puede haber un carácter sin palabras entre el número y las letras.

Consulte la demostración de expresiones regulares.

Detalles

  • (\.?\d*) - Grupo 1 (lo que REGEXEXTRACT devuelve): un . opcional seguido de 0 o más dígitos (cambie a (\.?\d+) para que coincida con 1 o más dígitos)
  • \W? - un carácter opcional sin palabras
  • (?:MC|P): un grupo que no captura (por lo tanto, no se devuelve con REGEXEXTRACT) ya sea una subcadena MC o un P carácter.
2
Wiktor Stribiżew 6 mar. 2018 a las 21:09

Para agrupar las dos condiciones finales, debe incluirlas entre paréntesis.

var input = [
  "FM.3 MC1",
  "FM.3 MC1 P2",
  "FM.3",
  "FM.3 P2"
];
var patterns = [
  /(.?\d*).?MC|P/g,
  /(.?\d*).?(MC|P)/g
];
for (let p = 0; p < patterns.length; ++p) {
  console.log("Using pattern '" + String(patterns[p]) + "':");
  for (let i = 0; i < input.length; ++i) {
    console.log("\tFrom '" + input[i] + "', found " + (input[i].match(patterns[p]) || "(no matches)"));
  }
}

Puede obtener una vista en vivo de sus coincidencias de expresiones regulares con una herramienta como regextester o regex101, entre otras.

1
tehhowch 6 mar. 2018 a las 21:14

NO PROBADO (No puedo molestarme en construir una muestra de datos sensibles del formato que ha elegido):

=join("",REGEXEXTRACT(A1,"(.?\d*).?MC|(.?\d*).P"))
1
pnuts 6 mar. 2018 a las 20:27