Azmisov, resucitando esta pregunta porque dijiste que estabas buscando any efficient alternative that could be used in JavaScript
y any elegant solutions that would work in most, if not all, cases
.
Suele haber una solución simple y general que no se mencionó.
En comparación con las alternativas, la expresión regular para esta solución es sorprendentemente simple:
"[^"]+"|(\+)
La idea es que ignoramos partido, pero nada entre comillas para neutralizar ese contenido (en el lado izquierdo de la alternancia). En el lado derecho, capturamos toda la +
que no fueron neutralizados en el Grupo 1, y la función de reemplazar examina el Grupo 1. Aquí está el código completo de trabajo:
<script>
var subject = '+bar+baz"not+these+"foo+bar+';
var regex = /"[^"]+"|(\+)/g;
replaced = subject.replace(regex, function(m, group1) {
if (!group1) return m;
else return "#";
});
document.write(replaced);
Online demo
Puede use el mismo principio para unir o dividir. Vea la pregunta y el artículo en la referencia, que también le indicará ejemplos de código.
Espero que esto te dé una idea diferente de una forma muy general de hacer esto. :)
¿Qué pasa con Empty Strings?
Lo anterior es una respuesta general para mostrar la técnica. Se puede ajustar según sus necesidades exactas. Si le preocupa que su texto puede contener cadenas vacías, solo cambia el cuantificador dentro de la expresión de cadena de captura +
-*
:
"[^"]*"|(\+)
Ver demo.
¿Qué hay de las cotizaciones de escape?
Una vez más, lo anterior es una respuesta general para mostrar la técnica. No solo puede "ignorar esta coincidencia". La expresión regular se puede adaptar a sus necesidades, puede agregar varias expresiones para ignorar. Por ejemplo, si desea asegurarse de que las comillas escapadas se ignoran adecuadamente, puede comenzar agregando una alternancia \\"|
en frente de las otras dos para hacer coincidir (e ignorar) las comillas dobles escapadas.
A continuación, dentro de la sección "[^"]*"
que captura el contenido de cadenas entre comillas dobles, se puede añadir una alternancia para asegurar comillas dobles escapado se hacen coincidir antes de su "
tiene la oportunidad de convertirse en un centinela de cierre, convirtiéndolo en "(?:\\"|[^"])*"
La expresión resultante tiene tres ramas:
\\"
para igualar y ignoran
"(?:\\"|[^"])*"
para igualar y ignoran
(\+)
a la altura, captura y manejar
Tenga en cuenta que en otros sabores de expresiones regulares, podríamos hacer este trabajo con más facilidad de búsqueda hacia atrás, pero JS no lo soporte.
La expresión regular completa se convierte en:
\\"|"(?:\\"|[^"])*"|(\+)
Ver regex demo y full script.
Referencia
- How to match pattern except in situations s1, s2, s3
- How to match a pattern unless...
Está claro que usted sabe lo que no puede hacer, pero no está claro por su pregunta lo que está tratando de hacer. ¿Puedes dar un ejemplo de tu problema y el resultado deseado? – cordsen
Agregó un ejemplo, para aclarar un poco. – Azmisov