Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Regex für Dummies



  • Please log in to reply
15 replies to this topic
David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

Hi Forum,

 

kann mir jemand mit einer Regex aushelfen? Leider hab ich die Syntax noch gar nicht drauf.

 

In einem String soll von links her eine mehrstellige Ziffer mit bis zu 10 Stellen mit einem anschließenden Underscore gefunden werden.

 

Dies hier

(\d*_)

funktioniert schonmal nicht, da es alle Underscores in dem String findet, und nicht nur die rechts neben einer Zahl stehenden.

 

Wie kann ich also die mehrstellige Zahl "\d*" in der Regex so mit dem Underscore verknüpfen, dass nur die Kombination, also "mehrstellige Zahl mit direkt anschließendem Underscore", gefunden wird?

 

Vielen Dank schonmal

Grüße David.P



David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

Hmm, so vielleicht?

 

^\d+_ 


sinkfaze
  • Moderators
  • 6367 posts
  • Last active: Nov 30 2018 08:50 PM
  • Joined: 18 Mar 2008
Oder:
^\d{1,10}_
Benötigen Sie den Unterstrich? Sie könnten dies auch tun:
^\d{1,10}(?=_)
 
Es tut mir Leid, ich spreche kein Deutsch. (Google Translate)

David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

Thanks, the Underscore should be matched (removed) as well.

 

Will this do it then?

^\d{1,10}_


sinkfaze
  • Moderators
  • 6367 posts
  • Last active: Nov 30 2018 08:50 PM
  • Joined: 18 Mar 2008
You'll want to use a lookahead assertion, like this:
RegExMatch("1234567_helloworld","^\d{1,10}(?=_)",match)
MsgBox %	match


David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

OK, but will this match the "1234567_" including the underscore?

 

And if yes -- what is the actual difference to my proposal:

^\d+_ 

Thanks

David



sinkfaze
  • Moderators
  • 6367 posts
  • Last active: Nov 30 2018 08:50 PM
  • Joined: 18 Mar 2008

Both patterns are matching for the same thing, the only difference is that your returned match will include the underscore, while mine will exclude it.  For example:

RegExMatch("1234567_helloworld","^\d+_",david)
RegExMatch("1234567_helloworld","^\d+(?=_)",sink)
MsgBox %	"David's match:`t" david "`nsinkfaze's match:`t" sink


IsNull
  • Moderators
  • 990 posts
  • Last active: May 15 2014 11:56 AM
  • Joined: 10 May 2007

Ich nutze meistens Gruppen, ich finde das am besten lesbar - sofern man bei einem Regex von lesbar sprechen kann.

(^\d+)_

Ich finde, man sieht so am besten, was gematcht wird, und was aussen vor gelassen wird.

Das Resultat ist dann in Gruppe 1, d.h.:

RegExMatch("1234567_helloworld","(^\d+)_",woot)

msgbox % woot1


David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

Thanks guys -- but I need "1234567_" as the result, not "1234567".

 

It seems that your last two scripts all yield "1234567", without the underscore.



sinkfaze
  • Moderators
  • 6367 posts
  • Last active: Nov 30 2018 08:50 PM
  • Joined: 18 Mar 2008
✓  Best Answer

Thanks guys -- but I need "1234567_" as the result, not "1234567".

 

?

 

Thanks, the Underscore should be matched (removed) as well.

 

If you need the underscore, the regex you created ^\d+_ should work fine.



David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

Thanks sink, that's great shy.png



David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

One more question guys,

 

would it be hard to code a script that does a two-step Regex search-and-replace action on file names, as soon as the files are drag-dropped on the script in Windows Explorer?

 

I'd need to do the following two rename steps on the files:

  1. Search for ^\d+_ and delete found string from filename
  2. Search for ^\d+__ and delete found string from filename

Can this be done without much hassle in AHK?

 

Thanks heaps already guys

Grüße David.P



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

^\d+__? Ist dann dein Regexmatch String.

das ? makiert den 2. _ als optional also können beide gefunden werden.

 

Um den Dateinamen zu trimmen musst du nun die Länge von diesem String rausfinden.

Der Regexmatch befehl hat dafür eine Option:

"P)^\d+__?"

Nun wird die Länge in der Ausgangsvariable gespeichert.

Regexmatch(Filename,"P)^\d+__?",Length)

 

Um die ganzen Dateien eines Ordners zu erhalte, benutzt man einen File für Dateien und Ordner.

Loop,wosuchen
If Regexmatch(A_LoopFileName,"P)^\d+__?",Length) 
;A_LoopFileName ist eine spezielle Variable sie enthält den momentanen Filename.

Nun nur noch Umbenennen

StringTrimLeft,NeuerName,A_LoopFileName,% Length

FileMove,% A_LoopFileFullPath,% A_LoopFileDir NeuerName

Wenn man das nun einsetzt erhält man das folgende Script:

wosuchen=C:/Dokumente und Einstellungen/User/Eigene Dateien/Eigene Bilder/*.* ;nur um zu verdeutlichen wie die Variable aussehen könnte
Loop,% wosuchen
If Regexmatch(A_LoopFileName,"P)^\d+__?",Length) 
{
StringTrimLeft,NeuerName,A_LoopFileName,% Length
FileMove,% A_LoopFileFullPath,% A_LoopFileDir NeuerName
}

Visit the new forum ahkscript.org.

http://ahkscript.org


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

Für weniger Probleme mit \

 

Loop,% wosuchen
if (Regexmatch(A_LoopFileName,"^\d+__?(.+)$",match))
    FileMove,% A_LoopFileFullPath,% (A_LoopFileDir ? A_LoopFileDir "\" : "") match1
 

Regards,
Babba

David.P
  • Members
  • 376 posts
  • Last active: Apr 29 2015 09:59 AM
  • Joined: 18 Nov 2006

Super, vielen Dank @nnnik für die verständliche Erläuterung und das Skript. Sorry dass ich so lange zum Antworten gebraucht habe.

 

Was bedeutet der Zusatz von @Babba?

 

Kann man das Skript so gestalten, dass Dateien, die im Explorer auf das Skript gezogen werden, automatisch umbenannt werden?