2017-05-17 2 views
0

Mit Blick auf diese Zeichenfolge:Regex - Wählen Sie den Inhalt nach "enthält" Bedingung?

[app/default-viewcomponent.ts] 

Ich brauche nur die gesamte Zeichenfolge zu wählen, wenn es . (mindestens eine)

enthält

Dies ist, was ich habe es geschafft, zu tun und es funktioniert (teilweise) :

(\[(.(?=.*\.[^\]]+)).*\]) 
  • () - weil ich brauche die Gruppe Inhalt
  • zu extrahierenpositiver Lookahead - alle Zeichen erhalten, die einen Zukunftspunkt haben
  • .*\] - nach dem Punkt kann es mehr Inhalt geben, der mit ] geschlossen wird.

an diesem Bild sucht, gibt es eine Übereinstimmung:

enter image description here

Aber wenn ich den Punkt zum letzten Zeichen bewegen, bevor ], gibt es keine Übereinstimmung:

[app/default-viewcomponentts.]

Frage:

Ich denke, ich weiß, was das Problem ist, es ist, weil die Regex nicht übereinstimmen eine Situation, wo der Punkt direkt vor der ] ist.

Wie kann ich meine Regex beheben, auch - gibt es eine bessere/einfachere Art, es zu tun?

REGEX101

Antwort

1

Es ist die + dort das Problem verursacht, weil in Ihrem regex burried ist die Bedingung

Jedes Zeichen, das nicht in dieser Klasse ist: []], eine oder mehr Wiederholungen

Ändern dass + auf eine * (eine beliebige Anzahl von Wiederholungen) das Problem behebt.

New Regex: (\[(.(?=.*\.[^\]]*)).*\])

Getestet gegen

[app/default-viewcomponentts.] 
[app/default-viewcomponent.ts] 
[app/default-viewcomponent.ts.] 
+0

Benötigen Sie auch '$' in '(\ [(. (? =. * \. [^ \]] *)). * \] $)' Für '[app/default-viewcomponentts] .' (Punkt am Ende) –

3

Sie das Problem ohne lookarounds lösen können, verwenden Sie 2 negierte Zeichenklassen:

\[[^\].]*\.[^\]]*\] 

den See regex demo

Beachten Sie, dass Sie auf diese Weise o nly match [...] wenn der Punkt innerhalb die Klammern ist.Ihre ursprüngliche Regex entspricht [...], wenn ein Punkt nach der schließenden Klammer ist, auch aufgrund der . Muster im Lookahead und . entspricht jeder Char, aber ein Zeilenumbruch char.

Einzelheiten

  • \[ - ein wörtliches [
  • [^\].]* - null oder mehr Zeichen andere als ] und .
  • \. - ein Punkt
  • [^\]]* - null oder mehr Zeichen andere als ]
  • \] - ein Literal ] (muss nicht entweichen, sondern nur aus Konsistenzgründen ausgeblendet werden).
0

Sie können überprüfen, ob die Zeichenfolge, die einen Punkt mit dem regex /^[[].*[.].*[]]$/g enthält, die Strings entsprechen:

  • ^[[] beginnt mit einem [
  • .* enthält eine beliebige Zeichen
  • [.] mindestens enthält einen Punkt
  • .* enthält alle Zeichen
  • []]$ endet mit einem ]

var regex = /^[\[].*[.].*[\]]$/g; 
 

 
function check(par){ 
 
    console.log(par + " match: " + regex.test(par)); 
 
} 
 

 
check("[app/default-viewcomponent.ts]"); 
 
check("[app/default-viewcomponentts.]"); 
 
check("[app/default-viewcomponentts]");
Test other string <input type="text" id="test" value="" onchange="javascript:check(this.value)">

Hinweis: mit Javascript Ich habe die Klammern zu entkommen.