簡體   English   中英

相同的正則表達式,但在僅Linux和Windows上的結果不同C ++

[英]the same regex but different results on Linux and Windows only C++

我的命令行程序具有以下模式:
^s?([/|@#])(?:(?!\\1).)+\\1(?:(?!\\1).)*\\1(?:(?:gi?|ig)?(?:\\1\\d\\d?)?|i)?$
基於ECMAScript 262 for C ++。

這是一種特殊模式,用於檢查用戶是否輸入了正確的命令。 這是對像這樣的字符串的測試:
optional-s/one-or-more/anything/optional-g-or-i/optional-2-digits

這是我以前的問題,為什么我需要這種模式
盡管它在Linux上運行良好,但在Windows上卻無法運行。 我也知道兩台機器上的換行符,並且我讀到以下內容: \\ n和\\ r在Linux和Windows上的處理方式有何不同?

我的程序可以處理任何文件,它僅獲取命令行argv[ 1 ]的第一個參數,並且std::regex_match測試輸入的用戶簡介是否正確。
像: ./program 's/one/two/' *.txt ,它可以將所有txt文件的名稱簡單地重命名為

C ++代碼:

std::string argv_1 = argv[ 1 ]; // => s/one/two/
bool rename_is_correct =
std::regex_match( argv_1, std::basic_regex< char >
( "s?([/|@#])(?:(?!\\1).)+\\1(?:(?!\\1).)*\\1(?:(?:gi?|ig)?(?:\\1-?[1-9]\\d?)?|i)?" ) );

問題:
雖然模式是非貪婪的 在Windows上,它變得貪婪並匹配超過4個定界符。 因此,它不應該匹配/one/two/three/four/five/但是該字符串是匹配的!


注意:

  • 我故意刪除了^$斷言,因為在C ++正則表達式中,默認情況下std::regex_match具有它們,因此不需要使用它們
  • 還有兩個反斜杠\\\\ ; 其中之一是逃脫角色
  • javescript代碼說no

 const regex = /^s?([/|@#])(?:(?!\\1).)+\\1(?:(?!\\1).)*\\1((?:gi?|gi)\\1-?[1-9]\\d|i)?$/gm; var str = 's/one/two/gi/-33/'; if( str.match( regex ) ){ console.log( "okay" ); } else { console.log( "no" ); } 

  • Perl中也說no ,因為你可以在截圖中看到,但C ++說okay

在此處輸入圖片說明

有人知道為什么它變得貪婪嗎?

謝謝。

GCC中似乎有一個錯誤已在5.4版中修復。 我的猜測是您正在Windows設置上運行舊版本。

在以下位置查看輸出差異:

是否包括boost似乎沒有什么區別。

該錯誤與(?!\\\\1) ,因為用(?![/])替換(在兩種情況下)都可以解決該問題,但是顯然,這將限制正則表達式僅與/分隔符一起使用:

此外,該錯誤還會通過以下簡單的正則表達式出現: (.)((?!\\\\1).) ,該表達式應拒絕aa類的輸入:

結論:確保安裝GCC 5.4或更高版本。

暫無
暫無

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

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