En este ejemplo...
(5) (dogs) (5 dogs) (dogs 5)Me gustaría coincidir solo con...
(5 dogs) -or- (dogs 5)Los números pueden ser cualquier cantidad de dígitos, contener comas, puntos decimales, operadores matemáticos, signos de dólar, etc. Lo único a lo que debo prestar atención es que hay números y caracteres alfabéticos presentes.
Comencé con esta modificación de un ejemplo proporcionado por hrs usando esto para RegEx...
\(((letter).*(number))\)|((number).*(letter))\)solo capturar esto...
(number letter) -or- (letter number)pero no...
(number) (letter)modificando la expresión para que sea...
\(((^[a-zA-Z]).*(^[0-9]))\)|((^[0-9]).*(^[a-zA-Z]))\)...pero obviamente no sé lo que estoy haciendo.
Puede usar la búsqueda anticipada para afirmar que hay un número y una letra dentro de cada conjunto de paréntesis:
\((?=[^)\d]*\d)(?=[^)az]*[az])[^)]+\) Las dos búsquedas anticipadas afirman que hay una cierta cantidad de caracteres de paréntesis que no son de cierre y luego un dígito (primera búsqueda anticipada (?=[^)\d]*\d) ) o una letra (segunda búsqueda anticipada (?=[^)az]*[az]) ). El [^)]+ luego coincide con los caracteres entre ( y ) .
En Javascript:
const str = '(5) (dogs) (5 dogs) (dogs 5)' const regex = /\((?=[^)\d]*\d)(?=[^)az]*[az])[^)]+\)/ig console.log(str.match(regex))Como alternativa con una única anticipación:
\((?=[^)az]*[az])[^\d)]*\d[^)]*\)Explicación
\( Partido ((?= anticipación positiva[^)az]*[az] Coincide con cualquier carácter excepto ) o az, luego coincide con az) Cerrar la búsqueda anticipada[^\d)]*\d Coincide con cualquier carácter excepto un dígito o ) y luego coincide con un dígito[^)]* Coincide con cualquier carácter excepto )\) Partido )Demostración de expresiones regulares
const s = '(5) (dogs) (5 dogs) (dogs 5)'; const regex = /\((?=[^)az]*[az])[^\d)]*\d[^)]*\)/ig; console.log(s.match(regex));