2011-07-05 24 views
1

我嘗試使用delphi進行重命名程序,並且需要知道是否可以使用正則表達式匹配指定數量的字符。從一開始就使用正則表達式匹配x個字符

例如如果字符串是FILENAME.TXT和特定數是6 它應當匹配FileNa

我還需要的圖案,以從特定數字給最終匹配的字符串。

如果答案包含描述,我會很高興,因爲我想學習正則表達式編碼。

+1

符合「字符」的是什麼?如果只是字母,那麼'^ \ w {6}'會做,但我認爲你會想要比這更嚴格的東西。 – NorthGuard

+0

我的意思是一個字符串,其中包含可用於文件名的所有字符。 –

+0

聽起來像你只是想使用'Pos()' –

回答

2

如果使用Delphi XE,則使用TRegEx類構建正則表達式功能。 http://www.regular-expressions.info/delphi.html

這個正則表達式匹配最多6個字符,直到.從其餘分離分機:如果您使用Delphi的早期版本,你可以在這裏,在這裏你還可以找到更多關於德爾福XE支持找到一個圖書館文件名。

^([^\.]{1,6})[^\.]*(?:\..*)?$ 

給定輸入:FILENAME.TXT
1組爲:FileNa

給定輸入:FILE.TXT
1組爲:文件

表達式使用分組來捕獲前6個字符。 Delphi XE中的代碼如下所示:

var 
    Regex: TPerlRegEx; 
    ResultString: string; 

Regex := TPerlRegEx.Create; 
try 
    Regex.RegEx := '^([^\.]{1,6})[^\.]*(?:\..*)?$'; 
    Regex.Options := []; 
    Regex.Subject := SubjectString; 
    if Regex.Match then begin 
     if Regex.GroupCount >= 1 then begin 
      ResultString := Regex.Groups[1]; 
     end 
     else begin 
      ResultString := ''; 
     end; 
    end 
    else begin 
     ResultString := ''; 
    end; 
finally 
    Regex.Free; 
end; 

例如文件名:FileName。TXT將匹配:FileNa(第1組)

我會盡力解釋我已經使用正則表達式,雖然有可能是更好的表達出有:

^ # Match beginning of line 
(# Begin a group (enables us to capture the contents alone) 
    [^\.] # Capture any character that is not a '.' 
    {1,6} # Capture anything from 1 to 6 of these characters (6 if possible) 
) # Close the group 
[^\.] # Match any character that is not '.' (again) 
* # Match this 0 or more times 
(?: # Begin a group that we do not wish to capture 
    \. # Capture the character '.' (the extension separator) 
    .* # Capture any character 0 or more times 
) # Close the group 
? # Match this group 0 or 1 time (it is either there or not) 
$ # Match the end of line 

下一部分你的問題,創造一個模式字符串從一個特定的號碼匹配到最後:

^(?:.{6})?(.*)$ 

給定輸入:這是一個測試
1組爲:是個考驗

在這個例子中,具體數量是,將其更改爲任何號碼,你正在尋找。我再次使用組來獲取匹配文本的內容。第一組是一個沒有捕獲的組,意味着我們對它的內容不感興趣,只是我們需要它在那裏。如果我們還在談論的文件名,你可以使用下面的正則表達式:

^(?:[^\.]{6})([^\.]*)(?:\..*)?$ 

給定輸入:FILENAME.TXT
1組爲:

這是一個修改第一個正則表達式,我第一個組沒有捕獲,告訴它是字符長(再次改變爲任何數字適合你)。並從捕獲的文本中排除擴展名。

請記住,正則表達式比閱讀更容易編寫。我總是發現:http://www.regular-expressions.info/是一個很好的信息來源,除了這本書已經幫了我很多:Mastering Regular Expressions

+0

感謝您的幫助。我想使用正則表達式有兩個原因。首先,我想學習正則表達式。第二,它比編程語言代碼更簡單。至少它很容易查看。我不知道它是否更快,但正則表達式會節省我的時間和精力。 –

+0

你是個好人。感謝您的詳細解答。我很高興來到這裏,與專家交談。 –

+0

再次非常感謝。但是當我測試這個代碼^(?:[^ \。] {6})([^ \。] *)(?:\ .. *)?$它匹配所有字符串。對於我來說,獲得一個從指定位置到其他指定位置匹配的模式會更好.extension Sincerely –

3
^.{6} 

將匹配前6個字符,但如果有不匹配少於6.

^.{1,6} 

將匹配前6個字符(儘可能多的,因爲它可以多達6),但如果字符串爲空,則不匹配。

.表示匹配任何字符(包括路徑分隔符,在你的情況)。如果您只需要字母,數字和下劃線,則可以使用\w替換.

^\w{1,6} 
+0

這工作正常:^。{1,6} –

+0

感謝您的幫助 –

+0

我也需要它從一個特定的位置匹配到另一個。或到最後。 –