Necesito comprobar si hay paréntesis coincidentes en una cadena que podría tener emoticonos (como :) o :(). Por ejemplo, "(:)())()", "(abcd)()ghijk)((mnop)qert)"

He utilizado los patrones "^[:\\(|:\\)]" para comprobar si hay emoticonos y "\\([^()]*\\)" para comprobar si hay paréntesis coincidentes, pero no se detectan. ¿Cómo puedo hacer esto?

0
user2071152 30 jul. 2017 a las 06:26

2 respuestas

La mejor respuesta

La solución realmente simple a este problema es contar los paréntesis, tratar de resolverlo con expresiones regulares es difícil, aunque las expresiones regulares extendidas pueden manejarlo. Aquí hay un bosquejo del algoritmo simple:

  1. Establecer openParenthesisCount en 0
  2. Itera sobre la cuerda:
    1. Si el carácter actual es ( incremento openParenthesisCount
    2. Si el carácter actual es ) decremento openParenthesisCount, si el recuento se vuelve negativo, falla (demasiados cierres)
    3. Si el carácter actual es : anticipado y omitir el siguiente carácter si es un paréntesis (omitir emoticones)
  3. Si openParenthesisCount es cero => tener éxito

HTH

1
CRD 30 jul. 2017 a las 06:32

Por lo que puedo decir, desea hacer coincidir una cadena si y solo si contiene paréntesis coincidentes, después de ignorar cada aparición de ":)" y ":(" en la cadena, si corresponde.

Entonces, intente esto:

^((?!:).)*\(.*(?<!:)\).*



Coincidirá con las siguientes cadenas:

  • ()
  • (abd)
  • (()) (
  • (:))
  • (:( :))
  • (:) ()) ()
  • (abcd) () ghijk) ((mnop) qert)
  • (a B C):
  • (:a B C)

Pero NO coincidirá con lo siguiente:

  • ) (
  • (:)
  • (:(
  • :( :)
  • :()
  • (:)
  • : () (:)
  • (
  • )
  • (a B C
  • a B C)
  • (a B C:)
  • :(a B C)
0
AppyFizz 30 jul. 2017 a las 04:57