javascript - Hur man matchar '+abc' men inte '++abc' utan lookbehind?


I en mening liknande:

Lorem ipsum +dolor ++sit amet.

Jag skulle vilja matcha +dolor men inte ++sit. Jag kan göra det med en lookbehind men eftersom JavaScript inte stödjer det kämpar jag med att skapa ett mönster för det.

Hittills har jag försökt med:

(?:\+(.+?))(?=[\s\.!\!]) - but it matches both words
(?:\+{1}(.+?))(?=[\s\.!\!]) - the same here - both words are matched

och till min förvåning ett mönster som:

(?=\s)(?:\+(.+?))(?=[\s\.!\!])

matchar ingenting. Jag trodde att jag kunde lura det och använda \s eller senare även ^ före +-tecknet men det verkar inte fungera så.

REDIGERA - bakgrundsinformation:

Det är inte nödvändigtvis en del av frågan, men ibland är det bra att veta vad allt detta är bra för, så för att klargöra några av dina frågor/kommentarer en kort förklaring:

  • vilket ord som helst i vilken ordning som helst kan markeras med antingen en + eller en ++
  • varje ord och dess märkning kommer att ersättas av en <span> senare
  • Fall som lorem+ipsum anses vara ogiltiga eftersom det skulle vara som att dela ett ord (ro+om) eller skriva två ord tillsammans som ett ord (myroom), så det måste ändå korrigeras (mönstret kan matcha detta men det är inte ett fel). Det bör dock åtminstone matcha de normala fallen som i exemplet ovan.
  • Jag använder en lookahead som (?=[\s\.! \!]) så att jag kan matcha ord på vilket språk som helst och inte bara \w:s tecken

Svar #1

Ett sätt skulle vara att matcha ett ytterligare tecken och ignorera det (genom att sätta den relevanta delen av matchen i en fångruppe):

(?:^|[^+])(\+[^\s+.!]+)

Men detta fallerar om potentiella matchningar kan vara direkt intill varandra.

Testa det live på regex101.com.

Förklaring:

(?:         # Match (but don't capture)
 ^          # the position at the start of the string
|           # or
 [^+]       # any character except +.
)           # End of group
(           # Match (and capture in group 1)
 \+         # a + character
 [^\s+.!]+  # one or more characters except [+.!] or whitespace.
)           # End of group

Svar #2

\+\+|(\+\S+)

Hämta innehållet från fångstgrupp 1. Regexen använder tricket som beskrivs i detta svar.

Demo på regex101

var re = /\+\+|(\+\S+)/g;
var str = 'Lorem ipsum +dolor ++sit ame';
var m;
var o = [];

while ((m = re.exec(str)) != null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }

    if (m[1] != null) {
        o.push(m[1]);
    }

}

Om du har indata som +++donor, använd:

\+\++|(\+\S+)