2016-04-26 11 views

Antwort

3

Ich würde Folgendes vorschlagen:

\.(\S*)(?=\.|$) 

Wie es funktioniert:

\. # . (Dot) 
( # Capture Data (foo) 
    \S # Any Non-Whitespace Character 
    *  # 0 or more times 
) 
(?= # Lookahead (Check) for... 
    \. # . (Dot) 
    |  # OR 
    $  # End of String 
) 

Die Daten, die Sie in der 1st Capture-Gruppe gespeichert werden soll

Live Demo on Regex101

Vielleicht möchten Sie es, dies zu ändern.

(? \ S +) (? =. | $)

Gelesen @ РоманПарадеев ‚s Kommentar


Probleme mit Ihrem RegEx:

\.(.+?)(?=[\.|\Z]) 
  • Die \. ist fein
  • .+?macht keinen Sinn (eigentlich zu siehe @ РоманПарадеев ist commen t, du solltest es wahrscheinlich benutzen).
    • + bedeutet oder mehr Zeiten, während * bedeutet oder mehr mal. So kann ich sehen, was Sie versuchten, zu erhalten, aber es ist einfacher, einfach zu verwenden (.*) (es sei denn, es gibt mehrere . in der Zeichenfolge, und Sie wollen es nicht gierig sein. Wieder, beziehen Sie sich auf @ РоманПарадеев 's Kommentar)
  • [\.|\Z] wird nicht funktionieren, wie Sie erwartet haben.
    • Zunächst keine Notwendigkeit, die \. zu entkommen, nur . verwenden. Als nächstes wird jedes Zeichen innerhalb von [] abgeglichen. Dies bedeutet, dass es mit ., | oder \Z übereinstimmt. Sie verwenden | nur innerhalb einer Gruppe, wie \.|\Z. Schließlich können Sie $ statt \Z
    • Das bedeutet, kann (?=\.|$)oder(?=[.\Z]) verwenden (\Z Bedürfnisse verwendet werden hier, weil $ ein Spiele $ wahrsten Sinne des Wortes)
+1

Eigentlich macht '. +?' Einen Sinn: Ein Fragezeichen macht einen Quantifizierer nicht gierig, so dass es mit möglichst wenig Zeichen übereinstimmt. Das ist der Grund, warum Ihre Lösung nicht mit Strings mit mehr als zwei Punkten umgehen kann, wie zB "a.b.c.d". –

+0

@ РоманПарадеев Messe, danke. Ich werde die Antwort aktualisieren ... – Druzion

0

Sie diese Regex verwenden können neben nicht-Punkt Text nach dem ersten DOT zu erfassen: in erfassten Gruppe # verfügbar

/^[^.]*\.([^.]*)/ 

Ihr Text ist 1

RegEx Demo

RegEx Breakup:

^   # line start 
[^.]*  # match 0 or more chars that are not DOT 
\.   # match a literal DOT 
([^.]*) # match 0 or more chars that are not DOT and capture the text in group #1 

Code:

var re = /^[^.]*\.([^.]*)/gm; 
 
    var str = 'asa .foo. assas\nbar .foo'; 
 
    var m; 
 
    var matches = []; 
 

 
    while ((m = re.exec(str)) !== null) { 
 
     if (m.index === re.lastIndex) 
 
      re.lastIndex++; 
 
     matches.push(m[1]); 
 
    } 
 

 
    document.writeln(matches);

0

ich so etwas wie diese verwenden würde: /\.(\S+?)(?=\.|$)/g

\. Literaler Punkt
(\S+?) ein oder mehr nicht-Leerzeichen (nicht gierige)
(?=\.|$) positiver Vorgriff-für entweder einen Punkt oder end-of-line

https://regex101.com/r/vL7cZ1/1

0

Ich würde in diesem Fall gegen Regex befürworten.

Es kann etwas lesbarer durchgeführt werden.

'asa .foo. assas'.split('.')[1] 
Verwandte Themen