J'ai essayé tellement de choses et essayé d'adapter des réponses similaires ... mais je suis toujours perdu aujourd'hui à cause de cela, si quelqu'un peut aider, je serais éternellement reconnaissant!

J'ai besoin d'utiliser un regex (la bibliothèque de lexer JS que j'utilise ne permet rien d'autre) pour correspondre:

  • Tout contenu entre $$ et */
  • Ne doit pas inclure l'ouverture $$
  • Mais doit inclure la fermeture */
  • Le "contenu" peut être n'importe quel caractère / chiffre / espace / nouvelle ligne

Compte tenu de ceci:

xxx. 123 $$yyy.234 */zzz.567
           ^^^^^^^^^^

... J'ai besoin de la chaîne indiquée pour correspondre.

En tant que tel, cela semble fonctionner correctement:

(?<=\$\$)(?:[\s\S])*?(?:[\s\S])*?\*\/

(... comme vu ici)

Mais il y a une exigence supplémentaire de:

  • S'il n'y a pas de $$, alors correspond simplement au début de la chaîne.

Par exemple.:

xxx. 123 yyy.234 */zzz.567
^^^^^^^^^^^^^^^^^^^

Ouais, aux limites de ma connaissance des regex et je ne peux tout simplement pas l'atterrir! :-(

Cela vaut peut-être la peine de mentionner que le symbole d'ouverture $$ n'est pas tout à fait solide, il ressemble plus à:

\$[\p{L}0-9_]*?\$
0
Tim Needham 28 août 2020 à 19:11

2 réponses

Meilleure réponse

Lors de la correspondance avec www $$ xxx $$ yyy */ zzz, je suppose que le résultat devrait être $$ yyy */ plutôt que $$ xxx $$ yyy */. La solution peut être plus compliquée que nécessaire si ce n'est pas une exigence.


(?: ^ | \$\$ )        # Starting at the start of the string or at "$$"
( (?: (?!\$\$). )*    # A sequence of characters (.) now of which starting with "$$"
  \*/                 # Followed by "*/"
)                     # End capture

Sauf pas tout à fait. Cela échouera pour $$$abc*/. Nous corrigeons donc:

(?: ^ | \$\$(?!\$) )  # Starting at the start of the string or at "$$" (but not "$$$")
( (?: (?!\$\$). )*    # A sequence of characters (.) now of which starting with "$$"
  \*/                 # Followed by "*/"
)

Nous pourrions également éviter les lookaheads.

(?: ^ | \$\$ )
( (?: [^$]+ ( \$[^$]+ )* \$? )?
  \*/
)

Concernant la question mise à jour, la version lookahead peut être modifiée pour s'adapter à \$[\p{L}0-9_]*\$.

(?: ^
|   \$ [\p{L}0-9_]* \$ (?! [\p{L}0-9_]* \$ )
)
( (?: (?! \$ [\p{L}0-9_]* \$ ) . )*
  \*/
)

J'ai utilisé des sauts de ligne et des espaces pour la lisibilité. Vous devrez les supprimer (puisque le moteur de JS ne semble pas avoir d'indicateur pour les faire ignorer comme le font certains autres moteurs).

2
ikegami 28 août 2020 à 20:57

Je sais que cela a déjà été répondu et accepté. Mais voici la manière la plus courte de le faire.

let str = "xxx. $$ 123 $$yyy.234 */zzz.567";
let regex = /\$?\w*\$?([\w \d.-]*\$?[\w \d.-]*\*\/)/gm;

console.log(regex.exec(str)[1]);

Mise à jour:
Comme mentionné dans les commentaires, la méthode ci-dessus échoue pour le type de chaînes a $ b */. Alors, je suis venu avec ça. Ce n'est pas aussi bon que @ ikugami, mais cela peut certainement être une autre façon.

let str = "$$xxx. $$gjjd*/ fhjgd";
let regex = /(\$?\w*\$?)([\w \d.-]*\$?[\w \d.-]*\*\/)/gm;

result = regex.exec(str).slice(1);

if (result[0].startsWith('$')) {
  result = result[1]

} else {
  result = result[0] + result[1]
}

console.log(result);
0
Ava 28 août 2020 à 21:37