Extrae el contenido entre paréntesis

Regex puede resolver el problema de extraer el contenido de corchetes no anidados

Encontré un problema, es decir, necesitaba extraer el contenido de cada corchete de la cadena, busqué en Internet y encontré que usaba expresiones regulares

(\[[^\]]*\])

El contenido entre corchetes se puede extraer y el siguiente texto se utiliza como objeto coincidente:

PerformanceManager[primer corchete]Producto[segundo corchete]<[tercer corchete]79~

El resultado de la coincidencia es:

0-->1er corchete
1-->2do corchete
2-->3er corchete

(Se puede probar con herramientas, URL: http://tools.jb51.net/regex/javascript )

Procesamiento de texto con paréntesis anidados

Escalada de dificultad: si los corchetes también contienen corchetes, la expresión regular perderá su efecto y tendrá que encontrar otra forma de hacerlo usted mismo y tener suficiente comida y ropa.

El código de AutoHotkey es el siguiente:

msg := "PerformanceManager[第1个中括号]Product[第2个中括号[中括号中包含中括号]]<[第3个中括号]79~"

for k,v in ExtractMessage(msg)
  MsgBox % k "-->" v

return

  /**
   * 提取中括号中内容,忽略中括号中的中括号
   * @param msg
   * @return
   */    
ExtractMessage(_msg) {
    list := []
    start := 1
    startFlag := 0
    endFlag := 0
    msg:=StrSplit(_msg)
    ; OutputDebug % obj2str(msg)
    loop % msg.length()
    {
      i:=A_Index
      if (msg[i] = "[") {
        startFlag+=1
        OutputDebug % "startFlag =" startFlag
        if (startFlag = endFlag + 1) {
          start := i
          
          OutputDebug % "start=" start
        }
      } else if (msg[i] = "]") {
        endFlag+=1
        OutputDebug % "endFlag =" endFlag
        if (endFlag = startFlag) {
          OutputDebug % "endFlag=" endFlag
          list.Insert(SubStr(_msg,start + 1, i-start-1))
        }
      }
      
    }
    return list
  }

La salida es la siguiente:

0-->1er corchete
1-->2do corchete [los corchetes contienen corchetes]
2-->3er corchete

Principio del algoritmo

La idea principal es atravesar la cadena, marcar y contar las posiciones inicial y final de los corchetes. Si es la posición final correspondiente a la posición inicial de los corchetes, entonces los conteos de la posición inicial y la posición final son lo mismo, por lo que lo que se intercepta es un chino completo El contenido de los corchetes.

Supongo que te gusta

Origin blog.csdn.net/liuyukuan/article/details/129166546
Recomendado
Clasificación