簡體   English   中英

用於刪除后綴的正則表達式

[英]Regular Expression for removing suffix

刪除文件名后綴的正則表達式是什么? 例如,如果我在諸如“ vnb.txt”的字符串中有一個文件名,那么刪除“ .txt”的正則表達式是什么? 謝謝。

您真的需要一個正則表達式來做到這一點嗎? 為什么不只尋找字符串的最后一個句點,並修剪字符串到該點呢? 坦白說,正則表達式有很多開銷,在這種情況下,我認為您不需要它。

如tstenner所建議,您可以嘗試以下一種方法,具體取決於您使用的是哪種字符串:

std :: strrchr

std :: string :: find_last_of

第一個例子:

char* str = "Directory/file.txt";

size_t index;
char* pStr = strrchr(str,'.');
if(nullptr != pStr)
{
    index = pStr - str;
}

第二個例子:

int index = string("Directory/file.txt").find_last_of('.');

如果您正在尋找一個可以提供除后綴之外的任何內容的解決方案,則應使用string :: find_last_of

您的代碼可能如下所示:


const std::string removesuffix(const std::string& s) {
  size_t suffixbegin = s.find_last_of('.');

  //This will handle cases like "directory.foo/bar"
  size_t dir = s.find_last_of('/');
  if(dir != std::string::npos && dir > suffixbegin) return s;
  if(suffixbegin == std::string::npos) return s;
  else return s.substr(0,suffixbegin);
}

如果要查找正則表達式,請使用\\.[^.]+$
您必須先逃避. ,否則它將匹配任何字符,並將$放在末尾,因此它將僅匹配字符串的末尾。

如果已經使用Qt,則可以使用QFileInfo ,並使用baseName()函數僅獲取名稱(如果存在),或使用suffix()函數獲取擴展名(如果存在)。

不同的操作系統可能在文件名中允許使用不同的字符,最簡單的正則表達式可能是(.+)\\.txt$ 獲取第一個捕獲組以獲取沒有擴展名的文件名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM